Реализация олицетворения / делегирования ASP.Net для подключения к удаленному SQL Server с сервера ASP.Net не работает

Я пытаюсь настроить олицетворение / делегирование для веб-приложения с использованием ASP.NET 4.5/SQL Server 2016. Цель состоит в том, чтобы использовать проверку подлинности Windows в веб-приложении и SQL Server.

Я воспроизвел в Azure настройку, аналогичную той, которая будет использоваться для производства, но я не могу найти то, что заставляет олицетворение не работать.

Azure VM # 1 [имя компьютера: test-iis-server]: Windows Server 2012 с IIS 8.5 и выполняющий роль контроллера домена Active Directory

Azure VM #2 [имя компьютера: test-sql-server]: Windows Server 2016 под управлением SQL Server 2016

Azure VM # 3 [имя машины: test-client]: машина Windows 10 для симуляции подключения пользователя к веб-сайту.

Я создал домен Active Directory с именем TEST, Возможно подключение к 3 машинам с пользователями, созданными в Active Directory.

Конфигурация веб-сервера IIS:

  • В файле web.config:

    • Authentication mode = Windows
    • Identity impersonate = True
    • validation validateIntegratedModeConfiguration = False
    • Integrated security = SSPI
  • В диспетчере IIS:

    • Windows authentication = Enabled (Kernel-mode authentication = Disabled, Providers = Negotiate:Kerberos)
    • ASP.NET Impersonation = Enabled
    • Пул приложений = Integrated Managed Pipeline (Identity = Custom Identity: test\my-svc-account)
  • В Active Directory Users & Computers

    • Для каждого компьютера (веб-сервер, сервер sql и пользовательский компьютер), я зашел в Свойства и проверил в Delegation табуляция Trust this computer for delegation to any service (Kerberos only),

Конфигурация SQL Server

  • Я здесь ничего не настраивал. Я предполагал, что ASP.NET будет использовать учетные данные пользователя, вошедшего в веб-приложение, для доступа к базе данных SQL Server.
  • Изменить: учетная запись службы SQL Server: test\my-svc-account

Результаты:

  • Если я не использую олицетворение в веб-приложении и использую определенный логин user/pwd, созданный в SQL Server, мое приложение работает нормально, и я могу получить учетные данные пользователя Windows, если захочу.

  • Используя олицетворение, я получаю ошибку соединения с SQL Server при открытии страницы веб-приложения: Login failed for user 'TEST\test-iis-server$',

Ожидаемое поведение:

  • Веб-приложение будет входить в SQL Server, используя учетные данные, используемые для входа на компьютер "test-client".

Я много читал о том, как реализовать олицетворение / делегирование для моего решения, но не могу понять, что не так. У кого-нибудь есть идеи, откуда возникла проблема и как я могу ее решить?

Редактировать № 1:

  • Из того, что я прочитал, кажется, что мне нужно настроить имена участников-служб. Я запутался в том, как правильно настроить их для моего сценария двойного прыжка.
  • Я создал учетную запись пользователя в Active Directory, чтобы действовать в качестве учетной записи службы. Я настроил эту учетную запись как доверенную для делегирования.
  • Я использую эту учетную запись в качестве удостоверения для пула приложений в IIS и в качестве учетной записи службы экземпляра SQL Server.

1 ответ

Да, вам нужно настроить имена участников-служб как для удостоверения пула приложений ASP.NET, так и для учетной записи службы SQL Server.

Это относительно просто, но вам нужно убедиться, что вы получите правильные значения.

В AD Users and Computers найдите учетную запись my-svc-account и откройте свойства. Перейдите на вкладку редактора атрибутов (если вы ее не видите, включите расширенные функции через меню "Вид" ADUC). Найдите атрибут servicePrincipalName и отредактируйте его. Добавьте следующее:

http/servicename.foo.com

http/servername <== необязательно

куда service.foo.com соответствует вашему DNS-имени. Если это CNAME, вам также необходимо указать имя записи А. Так что если servicename.foo.com карты для whatever.cloudapp.net, вам нужно добавить SPN для whatever.cloudapp.net, Это для IE, потому что IE... тупой... и пытается быть умным (он разрешает DNS до самой низкой именованной записи и запрашивает SPN для этого).

Затем сделайте то же самое для учетной записи службы SQL Server.

MSSQLSvc/sqlserver.foo.com

MSSQLSvc/sqlserver <== необязательно

Это должно быть полное доменное имя хоста SQL Server.

Наконец, вам необходимо включить ограниченное делегирование между удостоверением пула приложений и учетной записью службы SQL Server. Это третья кнопка переключателя в управлении делегированием. Добавьте имя участника-службы SQL Server в качестве делегированной цели.

Перезапустите IIS и SQL. Попробуйте перейти к приложению. Теперь вы должны увидеть, как он подключается к SQL в качестве вашего имени пользователя.

Другие вопросы по тегам