Сбой проверки подлинности Windows в IIS 7.5
Я создаю простое внутреннее приложение для своей компании, и оно требует проверки подлинности Windows для обеспечения безопасности. Все остальные режимы аутентификации отключены. Я застрял в ситуации, когда internet explorer запрашивает учетные данные 3 раза, а затем терпит неудачу с этой ошибкой:
Не Авторизован
Ошибка HTTP 401. Запрошенный ресурс требует аутентификации пользователя.
Затем я создал веб-сайт с голыми костями, чтобы проверить это. Я создал новый сайт в IIS, поставил он на свой собственный порт (:8111, выбранный наугад), поставил один статический "дефолт".файл HTM" там, анонимная проверка подлинности отключена, то проверка подлинности Windows. Все остальное было оставлено в настройках по умолчанию. Номер порта был назначен, потому что у нас есть несколько сайтов на этой машине, все они используют один и тот же IP.
Вот несколько сценариев:
-
Просмотр с самого веб-сервера на http: / / localhost: 8111 / работает отлично
-
Просмотр из другой компьютер, на http: / / ServerIPaddress: 8111/ прекрасно работает
-
Переход с другого компьютера на http: / / Имя_сервера: 8111 / завершается ошибкой (запрашивает учетные данные 3 раза, затем выдает ошибку 401)
Я искал в интернете и пытался найти решение, но пока безуспешно. Либо я его не нашел, либо недостаточно хорошо понимаю то, что читаю. Любая помощь будет очень признательна.
5 ответов:
Просто выработал решение с помощью коллеги после 2-х дней борьбы с этим вопросом. Вот что он написал:
Существует 2 поставщика для проверки подлинности Windows (Negotiate и NTLM). При установке проверки подлинности веб-сайта на проверку подлинности Windows, в то время как проверка подлинности Windows выделена, щелкните на поставщиках ссылка на правой панели или Диспетчер IIS и переместить NTLM в верхней части. Около по умолчанию переговоры сверху, который является, почему вы получаете запрос на аутентификацию.
Ошибка 401.1 при просмотре веб-сайта, использующего встроенную аутентификацию.
Решение
Отключить проверку замыкания на себя
* In Registry Editor, locate and then click the following registry key:
Разделе реестра HKEY_LOCAL_MACHINE\система\CurrentControlSet на\контроль\Нуа
* Right-click Lsa, point to New, and then click DWORD Value. * Type DisableLoopbackCheck, and then press ENTER. * Right-click DisableLoopbackCheck, and then click Modify. * In the Value data box, type 1, and then click OK.
Если он все еще не работает после перемещения NTML в начало списка поставщиков, попробуйте удалить Negotiate полностью, чтобы остался только NTML.
Это исправило для меня-перемещение NTML в верхнюю часть не помогло на Windows Server 2012 и IIS 8.5. Я нашел решение в следующей проблеме stackoverflow: Проверка подлинности Windows IIS 7.5 не работает в Chrome
Я лично рекомендую не отключать loopbackcheck глобально на вашем сервере (т. е.: Do NOT set
DisableLoopbackCheck
к значению1
в вашем реестре). Это уязвимость системы безопасности. Пожалуйста, отключите только для известных хостов.Вот функция Powershell, чтобы направить вас в правильном направлении.
function Add-LoopbackFix { param( [parameter(Mandatory=$true,position=0)] [string] $siteHostName ) $ErrorActionPreference = "Stop" Write-Host "Adding loopback fix for $siteHostName" -NoNewLine $str = Get-ItemProperty -Name "BackConnectionHostNames" -path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -erroraction silentlycontinue if ($str) { if($($str.BackConnectionHostNames) -like "*$siteHostName*") { Write-Host "`tAlready in place" -f Cyan } else{ $str.BackConnectionHostNames += "`n$siteHostName" Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0" -Name "BackConnectionHostNames" -Value $str.BackConnectionHostNames Write-Host "`tDone" -f Green } } else { New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0" -Name "BackConnectionHostNames" -Value $siteHostName -PropertyType "MultiString" Write-Host "`tDone" -f Green } Write-Host "`tnote: we are not disabling the loopback check all together, we are simply adding $siteHostName to an allowed list." -f DarkGray }
> Add-LoopbackFix "ServerName"
Прошло некоторое время с тех пор, как этот вопрос был задан, но я знаю, что многие люди часто сталкиваются с этим. Более правильное исправление для этого описано здесь: аутентификация в режиме ядра . Мы внедрили его несколько месяцев назад, и он прекрасно работает.
Еще одно хорошее объяснение здесь: MORE 2008 и KERBEROS: аутентификация запрещена, учетная запись пула приложений не зарегистрирована
Чтобы применить к одному сайту:
cd %windir%\system32\inetsrv set SiteName=TheSiteName appcmd.exe set config "%SiteName%" -section:system.webServer/security/authentication/windowsAuthentication /useKernelMode:"True" /useAppPoolCredentials:"True" /commit:apphost
Или применить ко всем сайтам:
%windir%\system32\inetsrv\appcmd.exe set config -section:windowsAuthentication /useAppPoolCredentials:"True" /commit:apphost