Iis 7 IIS 7.5中的Windows身份验证失败

Iis 7 IIS 7.5中的Windows身份验证失败,iis-7,windows-server-2008,windows-authentication,Iis 7,Windows Server 2008,Windows Authentication,我正在为我的公司构建一个简单的内部应用程序,它需要Windows身份验证以确保安全。所有其他身份验证模式均已禁用。我陷入了这样一种情况:internet explorer提示输入凭据3次,然后失败并出现以下错误: 未授权 HTTP错误401。请求的资源需要用户身份验证 然后我创建了一个简单的网站来测试这一点。我在IIS中创建了一个新站点,将它放在自己的端口上(:8111,随机选择),在其中放入一个静态“default.htm”文件,禁用匿名身份验证,然后启用windows身份验证。其他一切都保留

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

未授权

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

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

以下是一些场景:

  • 从web服务器本身浏览到http://localhost:8111/works 好的

  • 从另一台计算机浏览到http://ServerIPaddress:8111/ 很好

  • 从另一台计算机浏览到http://ServerName:8111/失败 (询问凭证3次,然后给出401错误)


我一直在网上搜索,试图找到一个解决方案,但迄今为止运气不佳。要么我没有找到,要么我对我正在读的东西理解得不够透彻。任何帮助都将不胜感激。

在与此问题斗争两天后,在同事的帮助下,刚刚制定出解决方案。他写道:

Windows身份验证有两个提供程序(协商和NTLM)。 将网站身份验证设置为Windows身份验证时, 在突出显示Windows身份验证的同时,单击提供程序 链接右窗格或IIS管理器,并将NTLM移到顶部。通过 默认协商是最重要的,这就是为什么你会得到 身份验证提示


浏览使用集成身份验证的网站时出现错误401.1

解决方案

禁用环回检查

* In Registry Editor, locate and then click the following registry key:
HKEY\U LOCAL\U 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.

这个问题已经问了很久了,但我知道很多人经常碰到它。此处介绍了更合适的修复方法:。我们几个月前就实现了这一点,而且效果很好

另一个很好的解释是:

要应用于单个站点,请执行以下操作:

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

我个人建议不要在服务器上全局禁用环回检查(即:在注册表中将
DisableLoopbackCheck
设置为
1
)。这是一个安全漏洞。请仅对已知主机禁用

这里有一个Powershell函数,可以让您找到正确的方向

函数添加
{
param(
[参数(必需=$true,位置=0)][字符串]$sitehostment
)
$ErrorActionPreference=“停止”
写入主机“为$siteHostName添加环回修复程序”-非WLINE
$str=Get ItemProperty-Name“BackConnectionHostNames”-路径“HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1\U 0”-erroraction silentlycontinue
如果($str){
if($($str.BackConnectionHostNames)-如“*$siteHostName*”)
{
写入主机“`tAlready in place”-f青色
}否则{
$str.BackConnectionHostNames+=“`n$siteHostName”
设置ItemProperty“HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0”-名称“BackConnectionHostNames”-值$str.BackConnectionHostNames
写入主机“`tDone”-f绿色
}
}否则{
新项目属性“HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0”-名称“BackConnectionHostNames”-值$siteHostName-属性类型“MultiString”
写入主机“`tDone”-f绿色
}
Write Host“`t注意:我们不是一起禁用环回检查,我们只是将$sitehostment添加到一个允许的列表中。”-f DarkGray
}

如果在将NTML移动到提供者列表的顶部后仍然无法工作,请尝试完全删除协商,以便只剩下NTML


这为我解决了这个问题-将NTML移到顶部对Windows Server 2012和IIS 8.5没有帮助。我在下面的stackoverflow问题中找到了解决方案:

+1为我找到了解决方案,而更深入和正确的答案是调查协商失败的原因。这会很快突出问题所在。因此损失了半天时间。谢谢你的修复。这也为我解决了。在我的例子中,我得到了504网关超时错误。@seph-我在下面发布了一个新的答案,其中引用了一篇msdn文章,该文章显示了使用协商解决此问题的方法。我删除了协商,它解决了它,但为什么??解释一下就好了。谢谢!!!这对我来说很有效,我从过去几个小时的开发者痛苦和挫折中解脱出来。谢谢你们。我只是瞥了一眼,看到这个注册表正在编辑。当上述NTLM修复不起作用时,我建议这是明确的下一步。我花了很多工作时间想弄明白这一点!这只会在从网站所在的同一台计算机上浏览时影响windows身份验证。这很危险。不要全局禁用环回检查。。。它的存在是有原因的。我曾经是一名sharepoint开发人员,并且必须在每个开发服务器构建中都这样做。。。但我在MVC领域已经有一段时间了,完全忘记了,所以谢谢你。在内部开发服务器上禁用它应该不会带来任何风险。如果它是生产服务器,您可能会远程访问它,并且无论如何都可以不使用环回。@Ryios,甚至在Dev中,建议的方法是按域而不是全局执行。在生产中,我们有很多应用程序(SOA)调用同一服务器上的其他应用程序。我希望能解释为什么我们神奇地修复了它,但现在还没有。我尝试取消内核模式,并将协商放回,但它没有修复它。删除Nego
> Add-LoopbackFix "ServerName"