将窗体身份validation与Windows身份validation混合

我有一个(ASP.NET 3.5)Intranet应用程序,它被devise为使用表单身份validation(以及默认的aspnet成员资格系统)。 我还在另一个表中存储了有关用户的附加信息,该表与aspnet_users表共享其主键。

对于属于我们域的用户,我将他们的域名存储在二级用户表中,我想自动login那些域名和存储在表中的名字相匹配的用户。

我已经阅读了可用的指南 – 它们都来自两年前或更久,并假设您可以在单独的login页面上激活Windows身份validation,以允许您提取域帐户名称。 从我所知道的情况来看,这在IIS7中是不可能的(整体身份validation方法应用于所有页面,无法select性地停用,并且两种身份validation方法都不能应用在同一页面上)。

有没有办法让IIS通过请求用户的Windows域帐户名称? 我不需要适当的ADauthentication,只需要域名。

其实,你可以做到。 @dr_draik迟到了一点,但是这对于我来说是一个谷歌的结果,所以我想我会分享一些知识。

如果您处于经典模式 – 启用Windows和窗体身份validation。 你会得到一个警告,不能同时做两个,但你可以忽略它 。 然后,你可以拼凑各种属性,如代码:

HttpContext.Current.Request.ServerVariables["LOGON_USER"]

并从那里钓鱼的用户名。

如果您处于集成模式 – 4021905 IIS7基于挑战和基于loginredirect的身份validation不能同时使用导致IIS 7.0两级身份validation与窗体身份validation和Windows身份validation这是一个模块,允许您有select地更改身份validation不同的页面。

你总是可以在IIS7中设置两个独立的应用程序。 一个会启用Windows身份validation。 另一个将是与表单authentication的主要应用程序。 如果用户转到Windows身份validation应用程序,该页面可以获取他们的凭据并将其传递给表单身份validation应用程序。

(更多信息的完整性)

我刚才在一个会议上问了一个.Net安全人员这个问题。 他的回答是,这在技术上是可行的,但是他从来没有见过(如果我做到了,就让他知道)。

他build议可以做的方法是制作自己的ISAPI筛选器并将其安装到IIS中。 ISAPI筛选器将拦截这些请求,并基本上执行IIS在使用集成身份validation时所做的工作,但如果不存在,则可以使用表单。 这涉及到filter中一些复杂的挑战/响应逻辑。 这是为了IIS6,所以它可能会在IIS7不同。

虽然这在技术上可能是可行的,但我不会build议这条路线,因为它感觉像是一个黑客,并且滚动自己的安全从来不是一个好主意(除非你真的知道你在做什么)。

有很多关于混合身份validation的文章,通过设置configuration使用允许匿名访问应用程序的forms。 其次,应使用设置为拒绝匿名的IIS设置创build集成身份validation页面,并使用集成身份validation。 在那里你可以通过检查请求的ServerVariables集合的“Logon_User”variables来实现这个魔术。 最后,为了集成身份validation来悄悄地login用户,它必须拥有简短的托pipe名称。 所以如果你的表单身份validation片通过FQDN暴露在互联网上,应该会有一些redirect到短主机页面。 我认为有可能只用IIS虚拟目录下的一个应用程序来实现。

这可能是您的问题的一个潜在的解决scheme: http : //msdn.microsoft.com/en-us/library/ms972958.aspx

我有一些你可以尝试 – 不知道它是否会工作。

在过去,我们使用了Request.ServerVariables [“LOGON_USER”],但显然这是为了返回一个非空值,您需要禁用匿名访问。

看到这篇文章: http : //support.microsoft.com/default.aspx/kb/306359

它build议在IIS端保持匿名访问,并使用Forms身份validation,但是拒绝匿名用户,如下所示:

<authorization> <deny users = "?" /> <!-- This denies access to the Anonymous user --> <allow users ="*" /> <!-- This allows access to all users --> </authorization>

不知道这是否会工作,但值得一试。

-Krip

不幸的是,你所要做的只是不被支持。 为了ASP.NET知道Windows用户名,您必须使用Windows身份validation。

您可以设置另一个站点/虚拟目录,只是将用户名信息转发到另一个页面。 但是,当非Windows身份validation的用户尝试login时会发生什么?

我find了一个解决scheme,没有使用特殊的附加组件。 这很棘手,涉及到所有页面中的元素。 我发布了它: http : //low-bandwidth.blogspot.com.au/2014/11/iis7-mixed-windows-and-forms.html

实质上,表单,窗口和匿名authentication必须被启用。 login屏幕应该是基于表单的,并且包含一个触发Windowslogin的button,该button发出HTTP 401响应质询,如果成功创build基于表单的login票据。

这个问题相当复杂,这个post贯穿了原理和解决scheme的细节。