ASP MVC Preview 5和IIS 6 Windows身份验证
我刚刚建立了一个基本的ASP MVC网站,以便在我们的Intranet上进行部署。它希望用户与IIS框位于同一域中,并且如果我们不是经过身份验证的Windows用户,则不应获得访问权限。
我刚刚将其部署到了在Server 2003 R2 SP2上运行的IIS6. 该Web应用程序使用自己的池用户帐户配置了自己的池。该Web应用程序的IIS目录安全性选项仅设置为" Windows集成安全性",并且web.config文件具有:
<authentication mode="Windows" />
如果通过http:// localhost / myapp访问,则IE7浏览器窗口可从IIS6服务器本身的远程桌面会话中成功验证和导航该Web应用程序。
但是,同样从服务器上,如果通过服务器名称(即http:// myserver / myapp)进行访问,则IE7会显示一个凭据对话框,在尝试输入正确的凭据三次后,最终将返回" HTTP错误401.1未经授权:访问由于以下原因而被拒绝:无效证件"。
当工作站浏览到Web应用程序URL(自然使用服务器名称而不是" localhost")时,会发生相同的问题。
IIS6服务器是我们唯一的域的成员,并且没有启用防火墙。
我有没有正确配置的东西才能正常工作吗?
谢谢,
到目前为止,我已经尝试过Matt Ryan,Graphain和Mike Dimmick的建议,但没有成功。我刚刚使用Server 2003 DC和单独的Server 2003 IIS6服务器构建了一个虚拟机测试实验室,并且能够重现该问题。
第一次尝试通过非本地url(即http:// iis / myapp)访问站点时,我在IIS6服务器的系统事件日志中看到一个条目。 FQDN URL也失败。
Source: Kerberos, Event ID: 4 The kerberos client received a KRB_AP_ERR_MODIFIED error from the server host/iis.test.local. The target name used was HTTP/iis.test.local. This indicates that the password used to encrypt the kerberos service ticket is different than that on the target server. Commonly, this is due to identically named machine accounts in the target realm (TEST.LOCAL), and the client realm.
解决方案
在我看来,我们做对了所有事情。
我确定我们是,但是我们确定要使用" DOMAIN \ user"作为用户帐户,而不仅仅是" user"吗?
听起来像Windows Server 2003 SP1的新"回送检查"安全功能。据我了解,它旨在防止特定类型的拦截攻击。
从http://support.microsoft.com/kb/896861
症状
当我们使用完全限定的域名(FQDN)或者自定义主机标头来浏览运行Microsoft Internet信息服务(IIS)5.1或者IIS 6的计算机上承载的本地网站时,我们可能会收到一条错误消息,指出类似于以下内容:
HTTP 401.1未经授权:登录失败
当网站使用集成身份验证并具有映射到本地回送地址的名称时,会发生此问题。
注意如果我们尝试直接在服务器上浏览网站,则只会收到此错误消息。如果我们从客户端计算机浏览该网站,则该网站将按预期工作。
原因
如果我们安装Microsoft Windows XP Service Pack 2(SP2)或者Microsoft Windows Server 2003 Service Pack 1(SP1),则会出现此问题。 Windows XP SP2和Windows Server 2003 SP1包括环回检查安全功能,旨在帮助防止对计算机的反射攻击。因此,如果我们使用的FQDN或者自定义主机标头与本地计算机名不匹配,则身份验证将失败。
解决方法
- 方法1:禁用环回检查
- 方法2:指定主机名
有关详细信息,请参见http://support.microsoft.com/kb/896861.
编辑只是注意到我们说我们也在客户端PC上看到了这一点……这很不寻常。但是我仍然希望测试这些变通办法之一,以查看它是否解决了问题(如果是,则可能表明DNS配置有问题)。
IE7仅在将服务器标识为位于Intranet上时发送Windows凭据(NTLM,Kerberos)。如果我们不在域中,则IE7还添加了Intranet区域锁定功能,默认情况下,Intranet区域中没有服务器。这样做是为了防止区域迁移攻击。
要更改此设置,请转到"工具/ Internet选项"的"安全性"选项卡,然后单击"本地Intranet"。然后,我们可以通过以下方法手动添加应被视为Intranet的服务器:单击"站点"按钮,然后单击"高级",或者告诉IE不要自动检测到Intranet,并根据需要选择其他复选框。
我刚刚遇到了相反的问题,我的网站从外部进行了身份验证,但没有在本地进行身份验证。
我将其与我们正在工作的站点进行了比较,不同之处在于,未能通过身份验证的站点正在使用Windows身份验证。
但是,与我合作的其他站点(这是一个开发服务器)往往具有基本身份验证。
不知道为什么,但是可以解决这个问题。
但是,与此同时,我注意到"默认域"和"领域"设置。
我知道这不太可能,但是这些可能完全有帮助吗?
经过广泛的Google搜索,我设法在以下MSDN文章中找到解决方案:
如何:为ASP.NET 2.0应用程序创建服务帐户
具体来说,"其他注意事项"部分描述了使用Windows支持工具中的setspn工具"为域帐户创建服务主体名称(SPN)":
setspn -A HTTP/myserver MYDOMAIN\MyPoolUser setspn -A HTTP/myserver.fqdn.com MYDOMAIN\MyPoolUser
这解决了我在虚拟测试实验室和原始问题服务器上的问题。
文章中还有一条重要说明,即对自定义池用户使用Windows身份验证会限制该池仅使用关联的DNS名称。也就是说,具有另一个身份的另一个池将需要与另一个DNS名称相关联。