IIS 7.5 中的 Windows 身份验证无法工作

28
我在IIS 7.5上遇到了Windows身份验证无法正常工作的问题。该应用程序是一个使用asp.net MVC 3构建的内部站点。应用程序池正在使用特定的域用户,站点正在使用Windows身份验证。每次尝试启动站点时,IE都会提示我进行登录。
如果我取消足够多次,站点就会出现,外观混乱,但我的名字与我的Windows登录相关联显示在顶部。这告诉我站点正确地获取了我的Windows凭据。
我添加了网络本地用户以便在服务器上对inetpub文件夹进行读取访问权限,现在它不再提示使用IE 8登录。但是在Chrome中,我收到以下错误消息:“错误338(net :: ERR_INVALID_AUTH_CREDENTIALS):未知错误。”
它位于我们的Intranet站点区域。我应该说明这一点,但我忘了。该站点曾在旧的开发服务器上运行,但当我升级到带有IIS 7.5的Win 2008 R2时,它停止工作了。曾经在2003年使用IIS 6.0。
我想知道是否有人有任何其他尝试的想法。我现在基本上是在原地打转。

我已经尝试了下面链接中的所有解决方案,但都没有解决问题。

http://forums.iis.net/t/1177154.aspx

http://forums.iis.net/t/1178188.aspx

使用集成的Windows身份验证接收登录提示

http://warnajith.blogspot.com/2011/06/iis-75-401-unauthorized-access-error.html

http://forums.asp.net/t/1639511.aspx/1

https://superuser.com/questions/128746/iis-asks-for-login-pass-when-accessed-using-hostname-but-not-when-localhost-is

http://ask.metafilter.com/183636/Prompted-for-a-username-and-password-when-browsing-to-an-IIS-virtual-directory

IIS 7和Windows身份验证

7个回答

23

相关说明:如果你正在尝试在本地主机上复制你的网站,且启用了Windows身份验证但仍然失败,解决方法是进行一些注册表修改来避免回环检查:

使用regedit,导航到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0 在MSV1_0中添加一个新的多字符串值,并将其命名为BackConnectionHostNames 添加你希望使用的主机名。例如,“mysite.com”。 重新启动IIS。

源链接

该值应该是你Windows hosts文件中的网站名称。

另外,为了能够使用PHP的file_get_contents访问未经身份验证的/data文件夹,我不得不向applicationHost.config文件中添加以下内容,以防止401错误。

<location path="mysite.com/data">
        <system.webServer>
            <security>
                <authentication>
                     <anonymousAuthentication enabled="true" />
                    <windowsAuthentication enabled="false" />
                </authentication>
            </security>
        </system.webServer>
    </location>

我不打算应用注册表修改(只是因为我讨厌跟踪注册表更改),但阅读本文揭示了问题:“反射攻击”。这实际上是指攻击者试图欺骗主机提供答案以回应其自身的挑战。显然,IIS有一个安全功能来防止这种情况。因此,如果您的站点使用与计算机相同的名称(或当前域),则只能在本地进行身份验证。 这个hack允许您规避该限制。 - Ross Brasseaux
1
请注意,我想补充说明此 hack 仅适用于我的个人开发环境。在正式生产环境中,这种方式是无法运行的。这是为了方便测试目的进行身份验证而做的。如果是这种情况,让您的站点名称与计算机名称相同有点荒谬。 - captainhero70
这个注册表添加是正确的答案!就像captainhero70所说:仅在DEV box上使用;但在那里非常需要。很傻,竟然这么难找到正确的答案! - Klompenrunner

18
我找到了答案。这是一个配置设置,没有在GUI中映射。我必须进入位于<%SystemDrive%>/Windows/System32/inetsrv/config的应用程序主机配置文件,并更改以下设置。
默认设置为 <windowsAuthentication enabled="true"> <providers> <add value="Negotiate" /> </providers> </windowsAuthentication> 更改为以下内容,然后它就可以工作了。 <windowsAuthentication enabled="true" useKernelMode="true" useAppPoolCredentials="true"> <providers> <add value="NTLM" /> </providers> </windowsAuthentication>

1
那是机器级别的配置,我想如果你将它添加到你的 web.config 中,它也应该能够工作。 - Ray Cheng
2
必须在机器级别上进行。在Web配置中已经设置好了这样的方式。 - divide_byzero
8
我以前遇到过类似的问题,并通过导航至IIS> web应用程序>身份验证>Windows身份验证>右键单击>提供程序>更改NTLM为顶部解决。我怀疑这是Kerberos身份验证不起作用之类的问题。如果您需要进一步排除故障,本系列文章http://technet.microsoft.com/en-us/library/ms191153.aspx中有一些很棒的有关Kerberos的文章会有所帮助。 - Rory
2
我曾尝试过那个,Rory,但直到我将useKernelMode和useAppPoolCredentials设置为true才起作用。由于某种原因,它没有在Web配置中拾取这些设置,我不得不在机器级别上进行设置。很抱歉让你等了这么久。 - divide_byzero
@divide_byzero 你好,我尝试按照你的指示操作了,但还是不行。我已经更新了applicationhost.config文件,并在IIS中启用了Windows身份验证并禁用了其他身份验证方式。我还需要配置什么吗? - Thit Lwin Oo
显示剩余5条评论

6
为了让IE传递集成凭证,该站点需要在您的内部网站区域。它不能在可信任站点或任何其他站点中。

它位于我们的内部网站区域。我应该已经说明了,但我忘了。该网站曾在我们旧的开发服务器上运行,但当我升级到带有IIS 7.5的Win 2008 R2时,它停止工作了。以前是在2003年使用IIS 6.0。 - divide_byzero
我无法感谢你的足够,这是许多必要步骤中的最后一步。希望IE聪明到可以自己解决这个问题,但还是非常感谢! - JosephDoggie

2
我遇到了类似的问题,只有将NTLM移动到Kerberos提供程序的顶部或修改DNS才能解决。当网站的主机头存在于DNS中作为别名(CNAME)时,问题仅在IIS7中出现。 在IIS6中,默认情况下,集成Windows身份验证仅使用NTLM。在IIS7中,IWS默认使用kerberos而不是NTLM。 用A记录替换CNAME记录可以解决该问题。 Kerberos在DNS中没有A记录的问题,但对别名存在问题。 因此,显然,DNS CNAME与Windows 2008上的kerberos不兼容。

2

我曾经遇到过类似的问题,解决方法是将用户组(MYDOMAIN\Users)添加到应用程序所在物理文件夹中,并赋予读取权限。


我有一个类似的问题/解决方案 https://dev59.com/Ieo6XIcBkEYKwwoYOR0q,但我对此不满意 - 有什么想法为什么需要这样做? - Rory

0
如果浏览器提示您输入凭据,我认为您的应用程序池凭据无法访问页面上的某些资源。您是否尝试创建一个空白的HTML页面并访问该页面?
<html>
<body>
hello world!
</body>
</html>

是的,我尝试过了,但没有成功。我尝试添加应用程序池和用于登录到应用程序池的用户。 - divide_byzero
你尝试过使用Fiddler监控流量吗?它可以告诉你页面上每个资源的请求和响应代码。HTTP响应代码应该是起点。 - Ray Cheng
我已经解决了这个问题。基本上是配置设置没有正确设置,导致身份验证无法正常进行。非常感谢你的帮助。 - divide_byzero

0

我有一个类似的问题。

我有一个应用程序在默认网站下,已经启用了Windows身份验证,但是没有起作用。我解决了这个问题,禁用了默认网站上的匿名身份验证,并在默认网站上启用了Windows身份验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接