ASP.NET身份+ Windows身份验证(混合模式 - 表单+ Windows)

时间:2015-02-08 20:28:45

标签: asp.net asp.net-mvc asp.net-identity windows-authentication

在提出这个问题之前,我已尽力搜索网页。我已经在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

6 个答案:

答案 0 :(得分:5)

IIS配置
在IIS中为整个站点启用匿名身份验证状态,在根目录下为某个文件夹启用Windows身份验证(例如,/ WindowsLogin)。在这个文件夹中放置aspx文件(用于WebForms项目)或创建ApiController(用于MVC项目)。

网站设置
在登录页面上添加按钮“使用Windows / ActiveDirectory帐户登录”(通常的做法是添加按钮登录Twitter,Facebook,Gmail等)。当用户按下此按钮时,它们将被重定向到/ WindowsLogin文件夹中的页面或控制器,这需要Windows身份验证。如果站点使用某些单点登录功能,则在该页面或控制器中找到它,在其他情况下,只为那里的Windows用户保存会话。如果用户访问了该页面或控制器,则它们已经被Windows身份验证用户验证过。

答案 1 :(得分:4)

其中一种可能的方法是在IIS中创建两个站点,但具有相同的目标文件夹,其中包含站点源。第一个站点适用于已启用Windows身份验证模式并绑定到80端口的内部用户,而第二个站点适用于启用了匿名模式并绑定到8080端口的外部用户。然后,在防火墙上,您将必须配置NAT,来自本地网络或VPN的所有请求将被重定向到端口80上的本地IIS服务器,并且来自Internet的所有请求将被重定向到IIS服务器的端口8080。 / p>

答案 2 :(得分:4)

这个术语是混合模式认证。我已多次这样做了。您只需要调整主站点。我就是这样做的。

将您的主MVC网站保持原样,但在Windows Auth。下以Anonymous vs.运行。

内部网站

创建重定向网站:将此网站设置为Window Auth,以便您可以从Active Directory中提取用户ID。为您的用户提供此URL和/或将其作为他们在您的Intranet上单击的链接。然后,此站点调用您的MVC站点并传递用户凭据(登录ID)。

一个。这可以通过URL上的加密字符串或cookie中的加密值来完成。您也可以使用到期日期/时间值进行加密。

湾(来自Forms Auth)使用该用户ID创建表单身份验证故障单。运行您拥有的任何其他登录逻辑。完成。

外部网站 - 无需更改。让用户按原样登录。

答案 3 :(得分:1)

您想要从一个URL处理表单和AD身份验证吗?我使用thinktecture(基于声明的auth)作为WIF的框架并编组各种形式的身份验证。但是,要从一个URL处理,我必须在登录时处理一些将用户与AD或基于表单相关联的逻辑。在最近的一个项目中,当我们创建用户帐户(它与表格身份验证的AD相关联)时,这是在用户管理处理的。然后,当用户登录时,他们将AD域名作为登录的一部分。有很多方法可以实现这一点,这只是我用过的方法。一个例子,而不是要求域,只需使用用户名,然后检查用户名上的AD或基于表单的标志,然后相应地处理身份验证

修改 只是重新阅读您的问题的更新。互联网用户和内网用户是否一样?如果是这样,您需要直接使用基于身份验证的表单,并独立于AD管理产品数据库中的用户。如果它们相同,那么他们可以登录域名前缀为用户名。如果你想完全依赖AD。

答案 4 :(得分:1)

我在前一份工作中做了一个关于这个概念的证明,所以细节很模糊,而且我没有任何代码可以参考...

要求是:

  • 内部(LAN)和外部(互联网)访问的单个URL
  • 两种类型的用户,即域中的人员和外部(非AD)用户
  • 内部和外部域用户的Windows身份验证
  • 使用iPad时输入域登录详细信息的功能(无Windows身份验证)

我提出的解决方案的核心思想是我们使用Active Directory组策略向http请求标头用户代理添加自定义字符串,内容并不重要,事实上我们使用了一个长的随机字符串人物。

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

然后,站点的登录页面会检查此项,如果发现重定向到虚拟目录,使用Windows身份验证,检查其AD帐户,则填充ASP.NET身份验证令牌,然后将其重定向到其主页。 / p>

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

唯一的另一件事是将AD电子邮件/密码检查添加到正常登录表单中,这样,如果域用户从非Windows设备(iPad)访问该站点,那么他们就可以使用他们的正常登录详细信息。

答案 5 :(得分:0)

为什么不将您的网站代码放在服务器上,将其复制到两个单独的网站,只需通过配置web.config来处理身份验证中的更改。 (一个将使用匿名设置,另一个使用Windows身份验证。)

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