Вопрос или проблема
Я нахожу различные результаты в Google, но ни один из них не решает мою проблему.
Я настраиваю новый сервер WINDOWS 2008 R2 на работе, который будет общаться с существующим сервером SQL 2012 с помощью веб-инструментов, работающих в IIS 7.5 в рамках нашей интранет-сети. Мы собираемся использовать удостоверение Windows на всех этапах – IE -> Веб-сервер -> SQL. Мы используем Kerberos. Когда я просматриваю инструмент локально на веб-сервере, все нормально, но как только я пытаюсь посмотреть его на удаленном клиенте, я получаю ошибку “Ошибка входа для пользователя ‘NT AUTHORITY\ANONYMOUS LOGON'”.
Позвольте мне объяснить, как мы настроили веб-сайт –
Пул приложений работает на .NET 2.0 в класическом режиме с идентичностью ApplicationPoolIdentity.
Удостоверение Windows включено, с выбранной Расширенной защитой (Extended Protection) в положении “Выкл”, включена аутентификация в режиме ядра (Enable Kernel-mode authentication), а активированные провайдеры (в порядке приоритета) – Negotiate и NTLM. Имитация пользователя ASP.NET включена и настроена на имитацию под аутентифицированным пользователем.
Строка подключения к SQL в следующем формате:
Data Source=THESQLBOXNAME;Initial Catalog=DATABASENAME;Integrated Security=True
У меня есть тестовая страница, которую я разместил на веб-сервере (с вышеупомянутыми настройками), которая отображает следующие данные:
HttpContext.Current.User.Identity.IsAuthenticated
равно true
HttpContext.Current.User.Identity.Name
– это ожидаемый пользователь (пользователь, открывающий браузер)
System.Security.Principal.WindowsIdentity.GetCurrent.Name
– это ожидаемый пользователь
Я пытаюсь выполнить простой SQL-запрос к SQL-серверу и получаю описанную выше ошибку входа.
Я проверил AD и удостоверился, что у веб-сервера установлен параметр делегирования – “Доверять этому компьютеру для делегирования только для указанных служб / Использовать только Kerberos”.
Я провел эту тестовую страницу на существующем сервере WINDOWS 2008 R2 с IIS 7.5 (с теми же вышеупомянутыми настройками), и я не получаю никаких ошибок.
Я проверил настройки SPN для обоих веб-серверов, и они одинаковые (за исключением имени машины):
setspn -L EXISTINGBOX
WSMAN/EXISTINGBOX.domain.com
WSMAN/EXISTINGBOX
TERMSRV/EXISTINGBOX.domain.com
TERMSRV/EXISTINGBOX
HOST/EXISTINGBOX.domain.com
HOST/EXISTINGBOX
RestrictedKrbHost/EXISTINGBOX.domain.com
RestrictedKrbHost/EXISTINGBOX
setspn -L NEWBOX
WSMAN/NEWBOX.domain.com
WSMAN/NEWBOX
TERMSRV/NEWBOX.domain.com
TERMSRV/NEWBOX
HOST/NEWBOX.domain.com
HOST/NEWBOX
RestrictedKrbHost/NEWBOX.domain.com
RestrictedKrbHost/NEWBOX
Я понимаю, что это похоже на проблему с двойным переходом, но тот факт, что это работает на другом сервере, заставляет меня думать, что это что-то специфичное для нового веб-сервера. Что же я упускаю?????
Последние две вещи, о которых я могу подумать, это проверить, зарегистрированы ли SPN MSSQLSvc под учетной записью службы SQL (что вы, возможно, уже сделали, поскольку у вас есть рабочий сценарий). На всякий случай:
- MSSQLSvc\NetBIOS
- MSSQLSvc\NetBIOS:1433
- MSSQLSvc\FQDN.domain.com
- MSSQLSvc\FQDN.domain.com:1433
Если это сделано, затем вернитесь к вкладке AD, где у вас есть параметр доверия, и добавьте учетную запись SQL-сервера в список разрешенных служб. Если все сделано правильно, вы должны увидеть MSSQLSvc* в списке.
Если вышеперечисленные методы не сработают, возможно, вам придется включить трассировку Kerberos или использовать сетевую трассировку для поиска ошибок Kerberos.
Проверьте, установлен ли на неработающем сервере IIS параметр “доверять этому компьютеру для делегирования”: http://blogs.technet.com/b/taraj/archive/2009/01/29/checklist-for-double-hop-issues-iis-and-sql-server.aspx
Ответ или решение
Проблема, с которой вы столкнулись, действительно может быть связана с типичной проблемой "двойного прыжка" (double-hop), когда аутентификация проходит не через всю цепочку. Для помощи в диагностике вашей ситуации и решения проблемы, я предлагаю вам выполнить следующие шаги:
-
Проверка SPN для SQL Server: Убедитесь, что для учетной записи службы SQL Server зарегистрированы все нужные Service Principal Names (SPN). Обычно это выглядит так:
MSSQLSvc/NetBIOS
MSSQLSvc/NetBIOS:1433
MSSQLSvc/FQDN.domain.com
MSSQLSvc/FQDN.domain.com:1433
Если SPN отсутствует, то вам нужно добавить его с помощью команды
setspn
. -
Проверка настройки делегирования: В Active Directory проверьте картину настройки делегирования для вашего SQL Server. Убедитесь, что учетная запись службы SQL Server имеет соответствующий уровень доверия. Для этого:
- Откройте свойства учетной записи SQL Server в AD.
- Перейдите в раздел "Delegation" и убедитесь, что выбрано "Trust this computer for delegation to specified services only" и что учетная запись службы занесена в список делегированных сервисов.
-
Тестирование правильности настроек: Проверьте, чтобы сервер, на котором выполнен IIS, также имел включенное "Trust this computer for delegation." Если это не так, аутентификация может не проходить.
-
Отладка Kerberos: Если вышеописанные шаги не помогли, вы можете включить трассировку Kerberos. Для этого можно использовать утилиты такие как Kerberos Logging или воспользоваться сетевыми трассировщиками, чтобы увидеть ошибки, которые возникают при аутентификации. Это даст больше информации о том, где именно происходит сбой.
-
Параметры аутентификации в IIS: Убедитесь, что все параметры аутентификации IIS (как Windows Authentication, так и Kerberos) настроены корректно. Возможно, стоит попробовать изменить порядок провайдеров аутентификации; например, сначала использовать NTLM, если с Kerberos возникают проблемы.
-
Проверка кластеров и безопасности: Если у вас есть кластеры или механизмы балансировки нагрузки, убедитесь, что они также правильно настроены на делегирование аутентификации.
-
Убедитесь в версии компонентов: Иногда проблема может заключаться в версиях .NET Framework или обновлениях Windows. Поддерживайте свои компоненты обновленными и совместимыми.
После выполнения всех этих шагов, если проблема не решится, пожалуйста, делитесь дополнительными деталями, такими как получение журналов событий или логи Kerberos, чтобы можно было глубже разобрать вашу ситуацию.