ASP.NET身份+ Windows身份validation(混合模式 – 窗体+ Windows)

在提出这个问题之前,我已经尽力searchnetworking了。 我在stackoverflow上看到过类似的问题,但是现在很长一段时间都没有得到满意的结果。 这是再次尝试得到这个经常性的问题的答案。

问题

如何构build一个为Intranet用户使用“Windows身份validation”的ASP.NET MVC 5网站,为Internet用户构build“Forms Auth”? 我们希望使用ASP.NET身份来实现这一点。 而且,我们不希望使用Active Directory组进行授权。 对于Intranet用户,我们希望使用Active Directory对其进行身份validation,然后回退到ASP.NET身份来pipe理其angular色和其他个人资料数据。

如果我们不要求最终用户selectauth方法,那将会很好。 Web应用程序应该无缝地login到Intranet用户。 他们甚至不应该知道有一个login屏幕。 同样,不应要求互联网用户input他们的域名证书。 他们应该立即看到基于表单的login屏幕。

有没有解决这个问题的build议方法? 或者,如果以下任何一种解决scheme是正确的,你能否评论?

http://world.episerver.com/blogs/Dan-Matthews/Dates/2014/8/Mixing-Forms-and-Windows-Authentication/

https://github.com/MohammadYounes/MVC5-MixedAuth

IIS 7.0 Two-Level Authentication with Forms Authentication and Windows Authentication

仅供参考这是2004年的文章,现在可能没有帮助: https : //msdn.microsoft.com/en-us/library/ms972958.aspx

IISconfiguration
在IIS中为整个站点启用匿名身份validation状态,并在根目录下的某个文件夹(例如/ WindowsLogin)中启用Windows身份validation。 在此文件夹中放置aspx文件(用于WebForms项目)或创buildApiController(用于MVC项目)。

网站设置
在login页面添加button“使用Windows / ActiveDirectory帐户login”(类似于通常的做法,使用Twitter,Facebook,Gmail等添加buttonlogin)。 当用户按下此button时,它们将被redirect到/ WindowsLogin文件夹中需要Windows身份validation的页面或控制器。 如果网站使用一些单一loginfunction,请在该页面或控制器中find它,在其他情况下,只需在此处为Windows用户保存Session。 如果用户访问了该页面或控制器,则他们已经被authentication为Windows用户。

其中一种可能的方法是在IIS中创build两个站点,但具有相同的目标文件夹,站点的源位于其中。 例如,第一个站点用于启用了Windows身份validation模式并绑定到80端口的内部用户,而第二个站点用于启用了匿名模式并绑定到8080端口的外部用户。 然后,在防火墙上,您必须configurationNAT,所有来自本地networking或VPN的请求将被redirect到端口80上的本地IIS服务器,并且来自Internet的所有请求将被redirect到IIS服务器的8080端口。

这个术语是混合模式身份validation。 我已经多次这样做了。 你只需要调整你的主站点。 以下是我如何做到的。

保持你的主要MVC网站,但运行它作为匿名与Windowsauthentication下。

内部网站

创buildredirectURL站点:将此站点设置为Window Auth,以便从Active Directory中获取用户标识。 给你的用户这个URL和/或把它作为他们在你的Intranet上点击的链接。 然后这个网站调用您的MVC网站,并传递用户凭据(loginID)。

一个。 这可以通过URL上的encryptionstring或cookie中的encryption值来完成。 您也可以使用过期date/时间值进行encryption。

湾 (从表单身份validation发言)使用该用户标识创build表单身份validation票证。 运行您拥有的任何其他login逻辑。 完成。

外部网站 – 无需更改。 让用户按原样login。

你想从一个URL处理表单和ADauthentication吗? 我已经使用思想(基于声明的身份validation)作为WIF的框架,并编组各种forms的身份validation。 但是,要处理如果从一个url,我不得不处理一些login时将用户关联到AD或基于表单的逻辑。 在最近的一个项目中,当我们创build用户帐户(它与Forms Auth的AD关联)时,这是在用户pipe理中处理的。 然后,当用户login时,他们会在AD域名的前面joinlogin。 有很多方法可以实现,这只是我用过的一个。 例如,不要求域名,只需使用用户名,然后检查用户名上的AD或基于表单的标志,然后相应地处理authentication

编辑只是在重新读你的问题的更新。 互联网用户和内网用户是一样的吗? 如果是这样的话,您只需要在整个板上进行基于表单的身份validation,并pipe理独立于AD的产品数据库中的用户。 如果他们是相同的,那么他们可以login将域名login到用户名。 如果你只想依靠AD。

我前一段时间做了一个这个概念的certificate,所以细节很模糊,我没有任何代码可以参考…

要求是:

  • 内部(LAN)和外部(互联网)访问的单个URL
  • 两种types的用户,即域中的用户和外部(非AD)用户
  • 域用户的内部和外部Windows身份validation
  • 在使用iPad时input域login详细信息(无窗口validation)

我想到的解决scheme的核心思想是,我们使用Active Directory组策略向http请求头添加一个自定义的string用户代理,内容无关紧要,实际上我们使用了一个长长的随机string。

https://technet.microsoft.com/en-us/library/cc770379.aspx

然后站点的login页面检查这个,如果发现redirect到一个虚拟目录,用windows auth,检查他们的AD帐户,填充ASP.NET身份validation令牌,然后redirect到他们的主页。

如果自定义标题不存在,那么它只显示正常的login表单。

唯一的办法是在正常的login表单上添加一个AD电子邮件/密码检查,这样,如果一个域用户从非Windows设备(iPad)访问该网站,那么他们可以使用正常的login信息。

为什么不把你的网站代码放在服务器上呢,把它复制到两个独立的网站上,通过configurationweb.config来处理authentication的变化。 (一个用匿名安装,一个用windowsauthentication。)

它不像其他方法那么时髦,但是相对来说是无痛的。 有两个网站,但内容(web.config除外)是相同的。