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

Posted

技术标签:

【中文标题】ASP.NET Identity + Windows 身份验证(混合模式 - 表单 + Windows)【英文标题】:ASP.NET Identity + Windows Authentication (Mix mode - Forms + Windows) 【发布时间】:2015-04-08 13:21:02 【问题描述】:

在问这个问题之前,我已尽力搜索网络。我在***上看到过类似的问题,但是很长一段时间以来都没有得到令人满意的回答。这是再次尝试回答这个反复出现的问题。

问题

如何构建一个 ASP.NET MVC 5 网站,该网站对 Intranet 用户使用“Windows Auth”,对 Internet 用户使用“Forms Auth”?我们希望使用 ASP.NET Identity 来完成此任务。此外,我们不想使用 Active Directory 组进行授权。对于 Intranet 用户,我们希望使用 Active Directory 对他们进行身份验证,然后回退到 ASP.NET Identity 来管理他们的角色和其他配置文件数据。

如果我们不要求最终用户选择身份验证方法会很好。 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

【问题讨论】:

你最终做到了吗?我正在寻找类似的解决方案,但同时为 Azure 提供解决方案以及 Active Directory 也增加了复杂性 Ravi,您能否找到解决方案,如果可以,请与我们分享解决方案。 还没有,等我发了。 您找到解决方案了吗? 不,我放弃了尝试。我们使用一个登录页面来管理这两种帐户类型。如果用户来自域(我们可以从@example.com 主机名中找出),我们使用 LDAP,否则我们使用表单身份验证。因此windows域用户不必创建新帐户并记住一个密码。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

前段时间,在我之前的工作中,我做了一个概念证明,所以细节很模糊,我没有任何代码可以参考......

要求是:

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

我想出的解决方案的核心思想是我们使用Active Directory组策略将自定义字符串添加到http请求标头用户代理中,内容无关紧要,实际上我们使用了一个很长的随机字符串.

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

然后该站点的登录页面会对此进行检查,如果发现重定向到一个虚拟目录,使用 Windows 身份验证,检查他们的 AD 帐户,填充 ASP.NET 身份验证令牌,然后将他们重定向到他们的主页。

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

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

【讨论】:

【参考方案3】:

这方面的术语是混合模式身份验证。我已经多次这样做了。您只需要调整您的主站点。这是我的做法。

保持您的主 MVC 站点保持原样,但以匿名方式运行,而不是在 Windows Auth 下运行。

内部网站

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

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

b. (从 Forms Auth 说起)使用该用户 ID 创建一个 Forms Authentication Ticket。运行您拥有的任何其他登录逻辑。完成。

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

【讨论】:

但是你有两个网址?那么技术不那么精通的用户只需要偶尔在办公室就必须记住两个 url 以及何时使用它们? 是的两个 URL,但是如果您甚至查看有关如何破解站点以使其与 Windows Auth 和 Anonymous 一起使用的 Microsoft 文档,他们会展示如何做到这一点,但建议您不要这样做安全原因。你有内联网吗?把链接放在那里。 @Bigwave 有多种方法可以在没有多个 URL 的情况下完成此建议。您可以配置您的 DNS 为 Intranet 用户提供内部 IP,例如www.example.com 在 Intranet 上指向 10.x.x.x,但在外部指向您的公共 IP。然后将小型 Windows Auth 应用程序设置为同一 URL 下的子站点,并为内部用户将匿名用户重定向到那里。或者,如果您使用的是负载均衡器,请为外部用户添加特定的“X-Forwarded-For”标头并查找它。也许不是最干净的解决方案,但通过一些工作,您可以使其尽可能无缝。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

编辑 只是重新阅读您的问题的更新。互联网用户和内网用户是一样的吗?如果是这样,您只需全面进行基于表单的身份验证,并独立于 AD 管理产品数据库中的用户。如果它们是相同的,那么他们可以在登录前将域名添加到用户名。如果您只想依赖 AD。

【讨论】:

不,Intranet 和 Internet 用户是不同的。我们想为内网用户使用windows auth,因为他们都使用公司的笔记本电脑\ PC 来访问网站。我们已经知道他们是谁,因为他们使用 Windows 帐户登录到他们的计算机。那么要求他们再次登录是没有意义的。因此 Windows 身份验证。互联网用户是外部供应商等,因此他们必须提供用户名和密码才能登录。【参考方案6】:

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

【讨论】:

我想这会有所帮助。但是,这也会导致维护另一个站点的额外工作量。它还会更改网站网址。任何想法,您如何将 Windows 身份验证与使用 asp.net 身份定义并存储在数据库中的角色连接起来? 无需额外努力维护网站。您只需在 IIS 中创建两个指向磁盘上同一站点的链接。 URL 将是一个:所有本地网络都在防火墙后面,只有防火墙有一个外部 IP 地址,域绑定到该地址。因此所有用户的域(URL)都保持不变,所有逻辑都隐藏在防火墙后面。 但是您不能以外部非 AD 用户身份从 LAN 登录?

以上是关于ASP.NET Identity + Windows 身份验证(混合模式 - 表单 + Windows)的主要内容,如果未能解决你的问题,请参考以下文章

[ASP.NET MVC] ASP.NET Identity登入技术剖析

ASP.NET Identity系列教程Identity高级技术

ASP.NET MVC Identity 添加角色

ASP.NET Identity系列教程(目录)

ASP.NET Identity系列教程

使用 Identity Server 4 和 ASP.NET Identity 添加外部登录