Реализация олицетворения / делегирования 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 в качестве вашего имени пользователя.