IIS 混合匿名和 Windows 身份验证

Posted

技术标签:

【中文标题】IIS 混合匿名和 Windows 身份验证【英文标题】:IIS Mixed Anonymous and Windows Authentication 【发布时间】:2016-01-23 12:43:50 【问题描述】:

我需要创建一个 ASP .NET 网页(托管在带有 IIS 7.5 的 Windows Server 2008R2 上),域用户和匿名用户应该可以看到该网页,而不会提示他们两个的凭据请求。域用户应有权查看整个页面,而匿名用户可以查看页面的公共部分。

当我启用 Windows 身份验证时: 域用户可以看到整个页面,但会提示匿名用户输入凭据。 当我启用匿名身份验证或两者(匿名和窗口)时:匿名用户可以看到页面的公共部分,但域用户看不到整个页面(他们就像匿名用户一样)。

我使用下面的字符串来区分匿名用户和域用户:

WindowsAccountName = HttpContext.Current.Request.LogonUserIdentity.Name;

如果 WindowsAccountName 为空,则用户为匿名用户,否则为域用户。不幸的是,启用匿名身份验证时,WindowsAccountName 始终为空(即使对于域用户也是如此),但是当禁用匿名身份验证时,会提示非域用户输入凭据。

你有解决这些问题的办法吗?请记住,域用户分布在不同的网络中,因此 IP 地址不是区分域用户和非域用户的好选择。

对我来说它看起来像一个 22 条规则

谢谢。

【问题讨论】:

【参考方案1】:

这方面的术语是混合模式身份验证。我已经多次这样做了。

这可以通过使用经过 Windows 身份验证的站点来完成,该站点不再从 AD 中提取用户凭据并将其传递给匿名站点。我使用在 5 秒后过期的自定义票证(数据库中的 GUID)完成了此操作。匿名站点获取传递的 GUID,查询数据库并获取用户 ID。我使用包含用户 ID 和时间戳的加密 URL 参数来完成此操作的其他方法。

内部网站

创建重定向 URL 站点:将此站点设置为 Window Auth,以便您可以从 Active Directory 中提取用户 ID。为您的用户提供此 URL 和/或使其成为他们在您的 Intranet 上单击的链接。然后此站点调用您的匿名站点并传递用户凭据(登录 ID)。

一个。这可以通过 URL 上的加密字符串或 cookie 中的加密值来完成。您也可以使用到期日期/时间值进行加密。

b. (从 Forms Auth 说起)使用该用户 ID 创建一个 Forms Authentication Ticket。运行您拥有的任何其他登录逻辑。完成。

外部网站 - 无需更改。让用户按原样登录。

【讨论】:

您写了“创建重定向 URL 站点:将此站点设置为 Window Auth,以便您可以从 Active Directory 中提取用户 ID。”,但如果非域用户访问此站点,则会提示您输入凭据,对吧? Michele,这是一个两步的方法。设置一个 Windows 身份验证站点,以便从活动目录中获取用户帐户。用户不会收到提示,然后您从 AD 中提取用户 ID。然后对其进行加密(如上所述)并将其传递到您在该站点上处理登录的匿名站点。对于最终用户,这是透明的。如果一个人应该只有匿名访问,他们会直接访问目标(非 Active Directory/匿名)站点。 @RegencySoftware - 我可以假设这会有效地导致同一应用程序的两个 URL 吗? IIS8(WIN2012)是否仍然是这种情况 这个答案似乎没有回答所提出的问题。 @Michelle 想检查安全上下文并确定用户是否已通过身份验证(阅读问题前的段落)。有两个端点 - 一个经过身份验证,一个没有帮助 - 当您想首先尝试身份验证并故障转移到匿名时,消费者如何知道要命中哪个端点? 问题假设内部站点与外部站点之间没有区别。也就是说,它的网址完全相同。该问题的重点是访问完全相同的网址的不同类型的用户。

以上是关于IIS 混合匿名和 Windows 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

在 IIS 中禁用匿名身份验证后 WebServiceHost 无法正常工作

匿名之前的 IIS Windows 身份验证

WCF WebHttp 混合身份验证(基本和匿名)

IIS 身份验证

我在服务器上的iis上的身份验证选项中去掉了匿名访问,启用了集成windows身份验证

ASP.NET Windows 身份验证仅提示一个用户的凭据