ASP MVC Preview 5 和 IIS 6 Windows 身份验证

Posted

技术标签:

【中文标题】ASP MVC Preview 5 和 IIS 6 Windows 身份验证【英文标题】:ASP MVC Preview 5 and IIS 6 Windows Authentication 【发布时间】:2010-09-12 06:51:47 【问题描述】:

我刚刚构建了一个基本的 ASP MVC 网站,用于在我们的 Intranet 上进行部署。它希望用户与 IIS 框在同一个域中,如果您不是经过身份验证的 Windows 用户,则不应获得访问权限。

我刚刚将它部署到在 Server 2003 R2 SP2 上运行的 IIS6。 Web 应用程序配置有它自己的池和它自己的池用户帐户。 Web 应用的 IIS 目录安全选项仅设置为“Windows 集成安全”,并且 web.config 文件具有:

<authentication mode="Windows" />

通过 IIS6 服务器本身的远程桌面会话,如果通过 http://localhost/myapp 访问,IE7 浏览器窗口可以成功验证和导航 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 也失败了。

来源:Kerberos,事件 ID:4 kerberos 客户端从服务器 host/iis.test.local 收到 KRB_AP_ERR_MODIFIED 错误。使用的目标名称是 HTTP/iis.test.local。这表明用于加密kerberos服务票据的密码与目标服务器上的密码不同。通常,这是由于目标领域 (TEST.LOCAL) 和客户端领域中的计算机帐户名称相同。

【问题讨论】:

我假设您将站点的主机标头设置为 localhost 和 myserver? 您可能希望将您的 web.config 代码放在自己的行中,并带有 4 个空格缩进以便它显示出来。也很高兴看到一位阿德莱德程序员使用 ASP.NET MVC。 还有一件事:您是否将任何读/写/执行安全设置应用于托管您的应用程序的文件夹(即 c:\inetpub\appdir)? 嘿,我现在遇到了与网站相反的问题——在外部进行身份验证,但不是在本地进行身份验证。如果我发现任何东西,我会通知你 仅供参考:设置虚拟实验室的速度出奇的快。我使用 MS Virtual PC 并为 DC 和 IIS 服务器从头安装了 Windows Server 2003,并在短短 2 小时内重现了问题。 【参考方案1】:

经过大量谷歌搜索后,我设法在以下 MSDN 文章中找到了解决方案:How To: Create a Service Account for an ASP.NET 2.0 Application

特别是描述使用 Windows 支持工具中的 setspn 工具“为域帐户创建服务主体名称 (SPN)”的附加注意事项部分:

setspn -A HTTP/myserver MYDOMAIN\MyPoolUser setspn -A HTTP/myserver.fqdn.com MYDOMAIN\MyPoolUser

这解决了我在虚拟测试实验室和原始问题服务器上的问题。

文章中还有一个重要说明,即对自定义池用户使用 Windows 身份验证会将关联的 DNS 名称限制为仅由该池使用。也就是说,具有另一个身份的另一个池需要与不同的 DNS 名称相关联。

【讨论】:

【参考方案2】:

听起来像 Windows Server 2003 SP1 的新 Loopback 检查安全功能。据我了解,旨在防止特定类型的拦截攻击。

来自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 或自定义主机标头与本地计算机名称不匹配,则身份验证将失败。

解决方法

方法一:禁用环回检查 方法 2:指定主机名

详情请见http://support.microsoft.com/kb/896861。


编辑 - 刚刚注意到您说您在客户端 PC 上也看到了这种情况……这更不寻常。但我仍然希望测试其中一种解决方法,看看它是否解决了问题(如果是,可能表明您的 DNS 配置存在问题)。

【讨论】:

我现在尝试了 KB896861 中的解决方法,但没有成功。我在事件日志中看到了与 Kerberos 相关的错误,因此我正在调查这些错误。【参考方案3】:

在我看来,你做的一切都是正确的。

我确定您是,但您确定您使用“DOMAIN\user”作为用户帐户,而不仅仅是“用户”吗?

【讨论】:

是的,使用 DOMAIN\user 并尝试了 FQDN\user 和 user@FQDN。【参考方案4】:

IE7 仅在将服务器识别为位于 Intranet 上时才发送 Windows 凭据(NTLM、Kerberos)。 IE7 还添加了 Intranet 区域锁定功能 - 如果您不在域中,默认情况下 no 服务器位于 Intranet 区域中。这样做是为了防止区域迁移攻击。

要更改此设置,请转到工具/Internet 选项、安全选项卡,然后单击本地 Intranet。然后,您可以手动添加应被视为 Intranet 的服务器,方法是单击“站点”按钮,然后单击“高级”,或者告诉 IE 不要自动检测您的 Intranet 并根据需要选择其他复选框。

【讨论】:

【参考方案5】:

我刚刚遇到了相反的问题——我的网站在外部进行身份验证,但不是在本地进行身份验证。

我将它与我们工作的网站进行了比较,不同之处在于未能通过身份验证的网站使用的是 Windows 身份验证。

但是,我使用的其他网站(这是一个开发服务器)往往具有基本身份验证。

不知道为什么,但这解决了它。

但是,同时我注意到“默认域”和“领域”设置。

我知道这不太可能,但这些可能有帮助吗?

【讨论】:

我很早就使用了默认域和领域设置,但没有运气。

以上是关于ASP MVC Preview 5 和 IIS 6 Windows 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

在 IIS 上使用 .NET Core 运行 ASP.NET 5 (MVC 6)

ASP.NET MVC 6 使用 IIS 开发无需发布

ASP.NET MVC之DDDFW IIS 发布之道

.NET 6 Preview 5 中的 ASP.NET Core 更新

iis 5.1 部署.NET MVC 问题

ASP.Net MVC 3/4 托管在 IIS 7.5 默认处理程序映射上