我有一个(ASP.NET 3.5)Intranet应用程序,它被设计为使用表单身份验证(以及默认的aspnet成员资格系统)。我还在另一个表中存储有关用户的其他信息,该表与aspnet_users表共享其主键。
对于属于我们域的用户,我将他们的域帐户名存储在辅助用户表中,并且我想自动登录其域帐户名与存储在表中的名称匹配的用户。
我已经阅读了可用的指南 - 它们都来自两年或更长时间,并且假设您可以在单独的登录页面上激活Windows身份验证,该页面允许您提取域帐户名称。但是,据我所知,这在IIS7中是不可能的(整个身份验证方法适用于所有页面,无法有选择地停用,并且两种身份验证方法都不能应用于同一页面。)
有没有办法让IIS通过请求用户的Windows域帐户名?我不需要正确的AD身份验证,只需要域名。
答案 0 :(得分:47)
实际上,你可以做到。对@dr_draik来说有点迟了,但这对我来说是谷歌的结果,所以我想我会分享一些知识。
如果您处于经典模式 - 启用Windows和Forms身份验证。你会收到关于不能同时做两件事的警告,但你可以ignore it。然后,你可以了解各种属性,如 代码:
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这是一个模块,允许您有选择地更改不同页面的身份验证。
答案 1 :(得分:4)
您总是可以在IIS7中设置2个单独的应用程序。一个人可以启用Windows身份验证。另一个是带有表单身份验证的主应用程序。如果用户访问了Windows身份验证应用程序,该页面可以获取其凭据并将其传递给表单身份验证应用程序。
答案 2 :(得分:4)
(更多信息的完整性)
我在一次会议上问了一个.Net安全人员这个问题。他的回答是,它在技术上可能,但他从未见过它(如果我做了它就让他知道它是否有效!)。
他建议可以通过制作自己的ISAPI过滤器并将其安装到IIS中来实现。 ISAPI筛选器将拦截请求,并且基本上完成IIS在使用集成身份验证时所执行的工作,但如果不存在则回退到使用表单。这涉及过滤器中的一些复杂的挑战/响应逻辑。这是针对IIS6的,因此在IIS7中可能会有所不同。
虽然这可能在技术上可行,我不会建议这条路线,因为它感觉有点像黑客,并且滚动自己的安全性从来都不是一个好主意(除非你真的知道你在做什么。)
答案 3 :(得分:1)
通过设置配置以使用允许匿名访问应用程序的表单,有很多关于混合authenticaton的文章。其次,应创建集成身份验证的页面,并将IIS设置设置为拒绝匿名并使用集成身份验证。通过检查requets的ServerVariables集合的“Logon_User”变量,您将获得神奇的技巧。最后,为了集成身份验证以静默登录用户,它必须具有短的托管名称。因此,如果您的表单身份验证部分通过FQDN向Internet公开,则应该有某种重定向到短主机页面。我认为在IIS下只有一个应用程序可以实现2个虚拟目录。
答案 4 :(得分:1)
我找到了一个没有使用特殊插件的解决方案。它很棘手,并且涉及将这里引用的所有页面中的元素拼凑在一起。 我发布了它:http://low-bandwidth.blogspot.com.au/2014/11/iis7-mixed-windows-and-forms.html
实质上,必须启用表单,窗口和匿名身份验证。 登录屏幕应该是基于表单的,并包含一个触发Windows登录的按钮,该按钮发出HTTP 401响应挑战,如果成功创建基于表单的登录票证。
问题相当复杂,这篇文章详细介绍了原则和解决方案。
答案 5 :(得分:0)
我有一些你可以尝试的东西 - 不确定它是否会起作用。
过去我们使用过Request.ServerVariables["LOGON_USER"]
但显然要返回非空值,您需要禁用匿名访问。
请参阅此文章:http://support.microsoft.com/default.aspx/kb/306359
它建议在IIS端保持匿名访问和Forms身份验证,但拒绝匿名用户如下:
<authorization>
<deny users = "?" /> <!-- This denies access to the Anonymous user -->
<allow users ="*" /> <!-- This allows access to all users -->
</authorization>
答案 6 :(得分:0)
不幸的是,你不想支持你想做的事情。为了让ASP.NET知道Windows用户名,您必须使用Windows身份验证。
您可以设置另一个只是将用户名信息转发到另一个页面的站点/虚拟目录。但是,当非Windows身份验证的用户尝试登录时会发生什么?