2010-02-12 286 views
46

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

对于属于我们域名的用户,我将他们的域帐户名称存储在次要用户表中,并且我想自动登录其域名帐户名称与存储在表中的名称相匹配的用户。

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

有没有办法让IIS通过请求用户的Windows域帐户名?我不需要适当的AD身份验证,只需要域名。

回答

45

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

如果您处于传统模式 - 启用Windows和窗体身份验证。你会收到关于不能同时进行这两项操作的警告,但你可以ignore it。然后,您可以spelunk各地的各种属性,如 代码:

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

和鱼的用户名离开那里。

如果您处于集成模式 - 4021905 IIS7 Challenge-based and login redirect-based authentication cannot be used simultaneiously导致IIS 7.0 Two-Level Authentication with Forms Authentication and Windows Authentication这是一个模块,允许您有选择地更改不同页面的身份验证。

+0

非常有趣 - 谢谢你在这里加入它,因为我认为这个主题有很多搜索点击。 – 2011-05-27 09:08:58

+0

切换接受的答案,因为显然这个问题已经得到了不少点击,并且这将更清晰。 – 2011-09-28 09:56:18

+0

甜,ta!我希望它有助于未来的谷歌 – 2011-09-28 15:53:55

0

我已经有东西可以尝试 - 不知道它是否会工作。

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

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

它建议保持在IIS侧匿名访问,和窗体身份验证,但否认匿名用户,如下所示:

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

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

-Krip

+1

谢谢 - 给它一个尝试,但它仍然是一个空字符串,即使使用建议的设置。 不幸的是我检查了这篇文章,并且它不适用于IIS7。 – 2010-02-12 12:48:52

0

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

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

+1

谢谢,这两个应用程序解决方案似乎是最可行的,但我认为我们只需要使用表单身份验证。只有登录才能有单独的应用程序,这感觉很笨拙。 – 2010-02-15 06:58:09

4

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

+1

谢谢,这两个应用程序解决方案似乎是最可行的,但我认为我们只需要使用表单身份验证。只有登录才能有单独的应用程序,这感觉很笨拙。 – 2010-02-15 06:56:50

4

(多为信息的完整性真的)

我问了.NET安全的人这个问题在一次会议而回。他的回答是,技术上可能,但他从来没有看到它完成(并让他知道,如果我做到了,它的工作!)。

他建议可以做的方式是制作自己的ISAPI筛选器并将其安装到IIS中。 ISAPI筛选器将拦截这些请求,并基本完成IIS在使用集成身份验证时执行的任务,但如果不存在,则会退回到使用表单。这涉及到过滤器中一些复杂的挑战/响应逻辑。这是为了IIS6,所以在IIS7中可能会有所不同。

虽然这可能是技术上是可行的,因为那感觉就像一个黑客位的我不建议这条路线,滚动自己的安全是从来没有一个好主意(除非你真的知道你是做)。

+1

感谢您的输入 - 这已经不再可能(或实际上不再可能),但有点令人烦恼,但我认为这是进步的代价。 – 2010-02-16 14:12:17

+0

感谢您分享此信息!我同意你所说的不是推出我们自己的安全特性,除非我们确信 – 2015-10-13 13:36:37

1

有很多关于混合authenticaton的文章,通过设置配置来使用允许匿名访问应用程序的表单。其次,应该创建一个用于集成身份验证的页面,并将IIS设置设置为拒绝匿名并使用集成身份验证。通过检查请求的ServerVariables集合的“Logon_User”变量,你会发现魔术。最后,为了集成身份验证来悄悄登录用户,它必须拥有较短的托管名称。所以如果你的表单身份验证片通过FQDN暴露在互联网上,应该有一些重定向到短主机页面。我认为只需要一个具有2个虚拟目录的IIS应用程序就可以实现。

+1

据我所知,这个解决方案在IIS6上工作,但不在IIS7中。这是因为在IIS6中,您可以为每个文件夹(甚至每个文件)分配auth模式,而在IIS7上,auth设置对于整个应用程序是全局的。 – pomarc 2010-12-21 13:39:26

1

我找到了一个不使用特殊插件的解决方案。这很棘手,涉及到从这里引用的所有页面中链接元素。 我发布了它:http://low-bandwidth.blogspot.com.au/2014/11/iis7-mixed-windows-and-forms.html

实质上,窗体,窗口和匿名验证必须启用。 登录屏幕应该基于表单,并且包含一个触发Windows登录的按钮,该按钮会发出HTTP 401响应质询,如果成功创建基于表单的登录票据。

这些问题相当复杂,而且这篇文章详细介绍了原理和解决方案。

相关问题