ASP.NET Основное приложение, использующее Entity Framework, не входит в базу данных SQL с использованием встроенной безопасности

#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;");
            }
        }
     }
 

Замена строки подключения в классе контекста правильной строкой подключения (см. Вопрос) решила проблему.