25

我正在为我的公司构建一个简单的内部应用程序,它需要 Windows 身份验证以确保安全。所有其他身份验证模式均被禁用。我陷入了 Internet Explorer 提示输入凭据 3 次的情况,然后失败并出现以下错误:

未经授权

HTTP 错误 401。请求的资源需要用户身份验证。

然后我创建了一个简单的网站来测试这一点。我在 IIS 中创建了一个新站点,将其放在自己的端口(:8111,随机选择)上,在其中放置一个静态“default.htm”文件,禁用匿名身份验证,然后启用 Windows 身份验证。其他一切都保持默认设置。分配端口号是因为我们在这台机器上有多个站点都共享相同的 IP。

这里有几个场景:

  • 从 Web 服务器本身浏览到 http:// localhost :8111/ 工作正常

  • 从另一台计算机浏览到 http:// ServerIPaddress :8111/ 工作正常

  • 从另一台计算机浏览到 http:// ServerName :8111/ FAILS(要求凭据 3 次,然后给出 401 错误)

到目前为止,我一直在网上搜索并试图找到一个没有运气的解决方案。要么我没有找到它,要么我对我正在阅读的内容不够了解。任何帮助将不胜感激。

4

5 回答 5

46

在与此问题斗争 2 天后,刚刚在同事的帮助下制定了解决方案。这是他写的:

Windows 身份验证有 2 个提供程序(协商和 NTLM)。将网站身份验证设置为 Windows 身份验证时,在突出显示 Windows 身份验证时,单击右侧窗格或 IIS 管理器上的提供程序链接,然后将 NTLM 移动到顶部。默认情况下,协商位于顶部,这就是您收到身份验证提示的原因。

于 2012-10-02T18:09:01.723 回答
19

浏览使用集成身份验证的网站时出现错误 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

于 2012-10-22T16:03:53.767 回答
6

如果在将 NTML 移到提供程序列表的顶部后它仍然不起作用,请尝试完全删除 Negotiate,以便只剩下 NTML。

这为我解决了问题 - 将 NTML 移到顶部对 Windows Server 2012 和 IIS 8.5 没有帮助。我在以下 stackoverflow 问题中找到了解决方案:IIS 7.5 Windows Authentication Not Working in Chrome

于 2015-07-15T18:55:47.077 回答
4

我个人建议不要在您的服务器上全局禁用环回检查(IE:不要您的注册表中设置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"

来源

于 2015-02-21T17:29:02.910 回答
2

自从提出这个问题以来已经有一段时间了,但我知道很多人经常遇到这个问题。此处描述了一个更合适的解决方法:内核模式身份验证。我们在几个月前实施了这个,它运行良好。

另一个很好的解释:MORE 2008 AND KERBEROS: AUTHENTICATION DENIED, APP POOL ACCOUNT BEINGNRED

应用于单个站点:

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
于 2014-01-30T18:18:28.183 回答