Ошибка аутентификации Windows в IIS 7.5
Я создаю простое внутреннее приложение для своей компании, и для обеспечения безопасности требуется проверка подлинности Windows. Все остальные режимы аутентификации отключены. Я застрял в ситуации, когда Internet Explorer запрашивает учетные данные 3 раза, а затем с этой ошибкой выходит:
Не авторизовано
Ошибка HTTP 401. Требуемый ресурс требует аутентификации пользователя.
Затем я создал веб-сайт с голыми костями, чтобы проверить это. Я создал новый сайт в IIS, поместил его на свой собственный порт (: 8111, выбранный случайным образом), разместил там один статический файл "default.htm", отключил анонимную аутентификацию, а затем активировал проверку подлинности Windows. Все остальное осталось по умолчанию. Номер порта был назначен, потому что у нас есть несколько сайтов на этом компьютере, которые используют один и тот же IP-адрес.
Вот несколько сценариев:
-
Просмотр с самого веб-сервера, на http:// localhost: 8111/works
штраф
-
Просмотр с другого компьютера на http:// ServerIPaddress: 8111/
отлично работает
-
Просмотр с другого компьютера на http:// Имя_сервера: 8111/FAILS
(запрашивает учетные данные 3 раза, затем дает ошибку 401)
Я искал онлайн и пытался найти решение без везения. Либо я его не нашел, либо я недостаточно хорошо понимаю, что я читаю. Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Просто разработал решение с помощью коллеги через 2 дня борьбы с этой проблемой. Вот что он написал:
Есть 2 провайдера для проверки подлинности Windows (переговоры и NTLM). При настройке аутентификации веб-сайта на проверку подлинности Windows, в то время как проверка подлинности Windows выделена, нажмите "Провайдеры" ссылку на правой панели или диспетчер IIS и переместить NTLM в начало. От default Negotiate находится сверху, поэтому вы получаете аутентификация.
Ответ 2
Ошибка 401.1 при просмотре веб-сайта, использующего встроенную проверку подлинности.
Решение
Отключить проверку обратной связи
* In Registry Editor, locate and then click the following registry key:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA
* 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.
http://support.microsoft.com/kb/896861
Ответ 3
Если он по-прежнему не работает после перемещения NTML в начало списка поставщиков, попробуйте полностью удалить Negotiate, так что осталось только NTML.
Это исправило это для меня - перемещение NTML в начало не помогло в Windows Server 2012 и IIS 8.5. Я нашел решение в следующей проблеме stackoverflow: IIS 7.5 Аутентификация Windows не работает в Chrome
Ответ 4
Я лично рекомендую НЕ отключать loopbackcheck глобально на вашем сервере (IE: Do NOT установить 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"
Источник
Ответ 5
Прошло некоторое время с тех пор, как этот вопрос был задан, но я знаю, что многие люди сталкиваются с этим много. Более правильное исправление для этого описано здесь: Аутентификация в режиме ядра. Мы реализовали это несколько месяцев назад, и он отлично работает.
Еще одно полезное объяснение здесь: БОЛЬШЕ 2008 И КЕРБЕРОС: АУТЕНТИФИКАЦИЯ ОСТАЛОСЬ, СЧЕТ ПРИБЛИЗИТЕЛЬНОГО БАССЕЙНА ВЗЯТЬ
Чтобы применить к одному сайту:
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