#sql-server #asp.net-mvc #asp.net-core #entity-framework-core
Вопрос:
Я создал простое ASP.NET Основной проект MVC, ориентированный на .NET 5.0, который берет данные из формы и должен сохранять их в таблице на SQL Server. Я использую базовый код entity framework-сначала в существующей базе данных. Я настроил приложение в соответствии с этим сообщением Microsoft. Это строка подключения.
data source=mynetworksqlserver;initial catalog=mycatalog;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework
Когда я захожу, чтобы сохранить изменения, я получаю сообщение об ошибке:
Исключение SQLException: Ошибка входа для пользователя » «
На сервере, на котором размещается SQL, происходит событие SQL Server
«Не удалось войти в систему для пользователя «». причина Неудачной попытки входа с использованием проверки подлинности SQL. Сервер настроен только для проверки подлинности Windows.»
Я не понимаю, почему приложение не использует встроенную безопасность:
настройки запуска:
{"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress": {
"applicationUrl": "http://localhost:57731",
"sslPort": 44382}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"}
},
"RC2": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" }}}}
Запуск:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddDbContext<RevLogonModel>(options=>options.UseSqlServer(Configuration.GetConnectionString("RevLogon")));
services.AddAuthentication(IISDefaults.AuthenticationScheme);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
.....
app.UseAuthentication();
app.UseAuthorization();
}
Вот выдержка из трассировки стека со мной, подтверждающая, что он пытается войти в систему с именем пользователя и паролем, а не с помощью системы безопасности Windows:
Microsoft.Данные.SqlClient.SqlInternalConnectionTds.Полный логин(bool enlistOK) Microsoft.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, строка NewPassword, защищенная строка newSecurePassword, bool игнорирует время ожидания, тайм-аут тайм-аута, bool с возвратом) Microsoft.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo, serverInfo, строка нового пароля, секретная строка newSecurePassword, bool перенаправленный пользователь, параметры подключения SqlConnectionString, учетные данные SqlCredential, тайм-аут тайм-аута)
У меня никогда не было такой проблемы с ASP.NET Использование MVC .СЕТЕВАЯ структура. Любая помощь или направление приветствуются.
Комментарии:
1. Может быть, потому
IIS
, что не добавляется к авторизованным пользователям SQL Server? IOW, проверьте, под каким пользователем запущено ваше приложениеEnvironment.UserName
.2. Спасибо за ide Святослав. Имя пользователя действительно является моим логином, когда я запускаю его через VS. Когда я развертываю его на сервере IIS, я получаю имя пула. Таким образом, приложение распознает пользователя Windows, но EF пытается войти в систему, используя пустое имя пользователя и пароль.
Ответ №1:
Я решил проблему, которая была в коде, который я не представил выше. Проблема была в моем классе контекста. Я использовал какой-то код производителя, который содержал неправильную строку подключения. Код в классе контекста переопределил код в классе запуска, поэтому контроллер игнорировал строку подключения в конфигурации запуска и использовал неверную в классе контекста. Вот исходный код, вызвавший проблему:
public partial class mycontext: DbContext
{
public mycontext(DbContextOptions<mycontext> options)
: base(options)
{
}
public virtual DbSet<reviewer> reviewers { get; set; }
public virtual DbSet<RevcommentFile> RevcommentFiles { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder
.UseSqlServer(@"Data Source=mynetworksqlserver; Initial Catalog=mycatalog;");
}
}
}
Замена строки подключения в классе контекста правильной строкой подключения (см. Вопрос) решила проблему.