IIS не может передать учетные данные Windows через приложение SQL Server для ASP.NET Core - PullRequest
0 голосов
/ 23 января 2019

Я работаю в большой компании с интранетом и логинами Windows AD для всех. У нас есть несколько внутренних баз данных SQL Server, которые позволяют нам входить в систему с использованием аутентификации Windows, к одной из которых я пытаюсь подключиться через приложение ASP.NET Core. Я могу подключиться к этой базе данных через SQL Server Management Studio и нормально запросить таблицы.

Я следовал руководству для приложения ASP.NET Core, используя существующую базу данных настолько близко, насколько это возможно, и создал один класс модели для тестирования, чтобы увидеть, могу ли я читать данные из база данных. При отладке с помощью IIS Express в Visual Studio я могу читать данные из базы данных при доступе к автоматически сгенерированному контроллеру и представлениям.

Все выглядит нормально при отладке, но при публикации в IIS я получаю следующую ошибку:

SqlException: Login failed for user '<DOMAIN>\<COMPUTERNAME>$'.

Где домен - это мой домен, а имя компьютера - это имя моего компьютера. Это ожидается, так как сам мой компьютер не имеет доступа к базе данных. Но он не должен пытаться подключиться с помощью этой системной учетной записи (со знаком доллара), он должен пытаться соединиться с моей учетной записью Windows: <DOMAIN>\<USERNAME>.

Что страннее, приложение делает , кажется, в какой-то мере распознает мои учетные данные Windows - когда я захожу на домашнюю страницу, я получаю знакомое сообщение "Hello, <DOMAIN>\<USERNAME>!" в навигационной панели. Таким образом, учетные данные Windows определенно передаются приложению, но по некоторым причинам не передаются при попытке подключиться к базе данных через DbContext.

Я что-то упускаю здесь очевидное?

Мой код

Я начал с шаблона базового веб-приложения ASP.NET для Visual Studio.

В файле launchSettings.json у меня есть:

  "iisSettings": {
    "windowsAuthentication": true, 
    "anonymousAuthentication": false, 
    "iisExpress": {
      "applicationUrl": "http://localhost:60686",
      "sslPort": 44336
    }
  },

В appsettings.json у меня есть:

  "ConnectionStrings": {
    "MyDB": "Server=<servername>;Database=<dbname>;Trusted_Connection=True;"
  },

В Startup.cs у меня есть следующая строка в ConfigureServices

            services.AddDbContext<MyContext>(options => {
                options.UseSqlServer(Configuration.GetConnectionString("MyDB"));
            });

И оттуда я установил контроллер MVC с представлениями, используя Entity Framework.

В IIS для аутентификации Windows установлено значение «Да», а для анонимной аутентификации - «Нет». Для моего пула приложений установлено значение «Нет управляемого кода» с ApplicationPoolIdentity.

Редактировать: проблема

Чтобы сформулировать реальную проблему, которую я пытаюсь решить, у меня есть база данных SQL Server на удаленном сервере интрасети, которая обеспечивает доступ к подмножеству всей компании через проверку подлинности Windows. Если я хочу создать приложение ASP.NET для предоставления API для этой базы данных, размещенной в IIS, каков наилучший способ сделать это? Предполагая, что:

  1. Я не хочу самостоятельно управлять разрешениями или дублировать их каким-либо образом
  2. Люди, которые имеют доступ к базе данных напрямую, должны иметь доступ к API, люди, которые не имеют доступа.
  3. Если они обращаются к нему из внутренней сети во время входа в Windows, им не нужно будет снова входить в систему.

Я предполагал, что могу просто передать их учетные данные Windows из IIS через приложение на сервер SQL, но я начинаю задумываться, так ли это на самом деле.

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Узнав больше о .NET и о том, что на самом деле делает аутентификация Windows в IIS, я скажу, что то, что я пытался сделать, не рекомендуется.Существует различие между передачей учетных данных Windows приложению .NET для чтения из них и выполнением вторичного процесса от имени этого пользователя.Последний случай - это то, что я пытался сделать, но вместо этого следует настроить пул приложений в IIS с пользователем, который может войти в базу данных, и использовать учетные данные Windows для проверки по списку пользователей, которые имеют доступ.

0 голосов
/ 08 мая 2019

Не выкапывать старый поток, но эта функция должна работать, пока установлено Identity Impersonate = True. Вот некоторые вещи, над которыми мы работаем.

GitHub Doc

0 голосов
/ 23 января 2019

Вы используете Entity-Framework для SqlServer, а EF использует ADO.NET SqlClient.Поэтому Trusted_Connection=yes; не работает.

Вместо этого добавьте Integrated Security=true;, и это следует исправить.

Вот некоторые ресурсы, чтобы прочитать об этом https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/connection-string-syntax

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...