在问这个问题之前,我已经尽力在网上搜索了一下。我在stackoverflow上看到过类似的问题,但很长一段时间以来都没有得到令人满意的回答。这是再次尝试回答这个反复出现的问题。
问题
如何构建一个ASP.NET MVC 5网站,该网站对Intranet用户使用"Windows Auth",对Internet用户使用"Forms Auth"?我们希望使用ASP.NET Identity来实现这一点。此外,我们不希望使用Active Directory组进行授权。对于Intranet用户,我们希望使用Active Directory对他们进行身份验证,然后返回ASP.NET Identity来管理他们的角色和其他配置文件数据。
如果我们不要求最终用户选择auth方法,那就太好了。web应用程序应无缝登录intranet用户。他们甚至不应该知道有登录屏幕。同样,不应该要求互联网用户输入他们的域凭据。他们应该立即看到基于表单的登录屏幕。
有什么建议的解决方法吗?或者,如果以下任何一项是正确的解决方案,您可以发表评论吗?
http://world.episerver.com/blogs/Dan-Matthews/Dates/2014/8/Mixing-Forms-and-Windows-Authentication/
https://github.com/MohammadYounes/MVC5-MixedAuth
http://mvolo.com/iis-70-twolevel-authentication-with-forms-authentication-and-windows-authentication/
仅供参考这是2004年的文章,现在可能没有帮助:https://msdn.microsoft.com/en-us/library/ms972958.aspx
IIS配置
在IIS中为整个站点启用匿名身份验证状态,并为根目录下的某个文件夹(例如/WindowsLogin)启用Windows身份验证。在此文件夹中放置aspx文件(用于WebForms项目)或创建ApiController(用于MVC项目)。
站点设置
在登录页面上添加按钮"使用Windows/ActiveDirectory帐户登录"(类似于添加按钮使用Twitter、Facebook、Gmail等登录的常见做法)。当用户按下此按钮时,他们将被重定向到/WindowsLogin文件夹中的页面或控制器,这需要Windows身份验证。若站点使用一些单一登录功能,请在该页面或控制器中找到它,在其他情况下,只需在那里为Windows用户保存会话。如果用户访问了该页面或控制器,则他们已经被验证为Windows用户。
一种可能的方法是在IIS中创建两个站点,但具有相同的目标文件夹,即站点源所在的位置。例如,第一个站点适用于启用Windows身份验证模式并绑定到80端口的内部用户,而第二个站点则适用于启用匿名模式并绑定至8080端口的外部用户。然后,在防火墙上,您必须配置NAT,来自本地网络或VPN的所有请求将重定向到端口80上的本地IIS服务器,来自Internet的所有请求都将重定向到IIS服务器的端口8080。
这一术语是混合模式身份验证。我已经做过多次了。你只需要调整你的主网站。以下是我的做法。
保持你的主MVC网站原样,但在Windows Auth下以匿名方式运行。
内部站点
创建重定向URL站点:将此站点设置为Window Auth,以便您可以从Active Directory中提取用户ID。将此URL提供给您的用户和/或使其成为他们在您的Intranet上单击的链接。然后这个站点调用你的MVC站点并传递用户凭据(登录id)。
a。这可以通过URL上的加密字符串或cookie中的加密值来完成。您也可以使用过期日期/时间值进行加密。
b。(来自Forms Auth)使用该用户ID创建一个Forms Authentication Ticket。运行您拥有的任何其他登录逻辑。完成。
外部网站-无需更改让用户按原样登录。
您想从一个URL处理表单和AD身份验证吗?我使用了thinktructure(基于声明的身份验证)作为WIF和封送各种形式的身份验证的框架。然而,为了处理是否来自一个URL,我必须在登录时处理一些逻辑,这些逻辑将用户与基于AD或Forms的用户关联起来。在最近的一个项目中,当我们创建用户帐户时,这是在用户管理中处理的(它与Forms Auth的AD相关联)。然后,当用户登录时,他们会将AD域名作为登录的一部分。有很多方法可以实现这一点,这只是我使用过的一种方法。例如,不需要域,只需使用用户名,然后检查用户名上的AD或基于表单的标志,然后相应地处理身份验证
编辑只是重读你的问题的更新。互联网用户和内联网用户相同吗?如果是这样的话,你只需要全面进行基于表单的身份验证,并在独立于AD的产品数据库中管理用户。如果他们是相同的,那么他们可以在域名之前登录到username。如果你想只依赖AD.
我在前一份工作中做了一个概念验证,所以细节很模糊,我没有任何代码可以参考…
要求是:
- 用于内部(LAN)和外部(internet)访问的单一URL
- 两种类型的用户,域上的用户和外部(非AD)用户
- 内部和外部域用户的Windows身份验证
- 使用iPad时可以输入域登录详细信息(无windows身份验证)
我提出的解决方案的核心思想是,我们使用Active Directory组策略向http请求标头用户代理添加一个自定义字符串,内容无关紧要,事实上我们使用了一个长的随机字符串。
https://technet.microsoft.com/en-us/library/cc770379.aspx
然后,该网站的登录页会对此进行检查,如果找到,则会重定向到一个虚拟目录,并使用windows auth检查其AD帐户,填充ASP.NET身份验证令牌,然后将其重定向到主页。
如果自定义标题不在那里,那么它只显示正常的登录表单
唯一的另一件事是在正常登录表单中添加AD电子邮件/密码检查,这样,如果域用户从非windows设备(iPad)访问网站,他们就可以使用正常登录详细信息。
为什么不把你的网站代码放在服务器上,自动复制到两个独立的网站,然后通过配置web.config来处理身份验证中的更改
它不像其他方法那样时髦,但相对来说无痛。有两个网站,但内容(除了web.config)是相同的。