Сбой проверки подлинности 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 22

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.

Http://support.microsoft.com/kb/896861

Если он все еще не работает после перемещения 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