【问题标题】:Can a website authenticate against multiple ADFS servers?一个网站能否针对多个 ADFS 服务器进行身份验证?
【发布时间】:2016-07-28 20:08:39
【问题描述】:

我们有一个使用 FormsAuthentication 的 ASP.NET/MVC 网站。像往常一样,当用户尝试访问一个页面并且没有有效的 FormsAuthentication cookie 时,IIS 会将他重定向到登录视图。当用户对登录控制器执行 HttpPost 时,我们的控制器操作会调用我们的 WebApi Web 服务,该服务根据 Sql Server 数据库验证用户名、密码和客户 ID。如果身份验证通过,控制器操作会设置 FormsAuthentication cookie,并重定向到用户请求的页面。

现在,销售人员正在宣传“单点登录”,尽管我不清楚他们的确切含义。据我所知,在 Microsoft World 中,这通常意味着访问 MS 的 Active Directory 联合服务。

此时我几乎不知道这将如何工作,但在我深入研究之前,是否可以将身份验证代码放在 WebApi Web 服务中,我们可以选择针对 Sql Server 数据库进行验证,还是针对适合指定客户的任何 ADFS 服务器?

我们的问题是我们有我不知道有多少成千上万的用户,为数百个客户工作。许多客户不会运行 ADFS,而那些运行的客户将各自拥有自己的 ADFS 服务器。

我看到的关于单点登录的大部分内容似乎都涉及将浏览器重定向到 ADFS 服务器,然后重定向回来,如果您已经登录,则看起来完全避免登录。我没有在我们的情况下,我们认为我们可以做到这一点。在我们访问数据库之前,我们无法知道要重定向到哪个 ADFS 服务器。

那么问题来了 - 是否可以完全通过我们的 WebAPI Web 服务中的 C# 代码进行 ADFS 身份验证?

(一种可能的复杂情况 - 网站本身对任何数据库的访问权限为零。其 web.config 中的唯一配置设置是 web 服务的基本 URL。无论发生什么身份验证都必须在 web 服务中进行,而不是在网站中进行。 )

【问题讨论】:

  • 总是在对 SSO 的方式和内容有疑问时,请考虑一下 Google 生态系统。您访问他们的任何应用程序,您将被重定向到另一个应用程序的登录页面,然后使用经过身份验证的用户信息重定向回来。这种分离允许身份提供者引入新功能(如两因素身份验证),而不会打扰所有使用身份提供者的应用程序。而且,并非如此,Microsoft 世界中的 SSO 与 ADFS 无关。这只是其中一种选择。

标签: c# asp.net-mvc asp.net-web-api adfs


【解决方案1】:

首先,“单点登录”(SSO) 不限于 ADFS。它只是意味着您只需键入一次凭据,然后您访问的所有系统都会自动“识别”您;所有后续的授权请求都是透明的。例如,如果您在公司 Intranet(同一个 AD 域)中有多个使用 Windows 身份验证的网站,则您有 SSO:您在登录到计算机时进行一次身份验证,然后您的 Web 浏览器使用 NTLM 自动对这些网站进行身份验证或 Kerberos。在这种情况下没有 ADFS。

ADFS(以及更普遍的“联合”)允许的是跨安全边界的 SSO。在 Windows 世界中,安全区域通常由 Active Directory 林创建;使用 Windows 身份验证提供的 SSO 可以访问此林中的所有内容。但是一旦您离开这个区域(SaaS 应用程序、另一个公司网络中的网站),您就需要另一个身份验证协议来执行 SSO,而这些协议是在 ADFS 中实现的。

那么关于你的具体问题:

  • 您可以做的不是使用 FormsAuth,而是使用 AdfsAuth。当未知用户访问页面时,他将被重定向到 ADFS 进行身份验证(使用您正确提到的浏览器重定向)。要知道哪个 ADFS 服务器应该对您的用户进行身份验证,您需要一种方法来区分它们:每个客户的 IP 范围列表?每个客户的 URL 不同?如果你没有这样的东西,那么唯一的方法就是向他们展示一个选项列表,例如:“我为公司 A 工作”、“我为公司 B 工作”、“我为公司 C 工作”、“我没有”不为这些公司工作并希望使用 FormsAuth 进行身份验证。”
  • 在这种情况下,您的 WebApi Web 服务必须做的是:如果我知道要使用哪个 ADFS 服务器,则将用户重定向到那里。否则,像往常一样使用数据库对用户进行身份验证。
  • 当您为客户使用 AdfsAuth 时,您的数据库毫无用处。您可以删除与该客户相关的所有凭据。

完全从我们的 WebAPI 中的 C# 代码执行 ADFS 身份验证

好吧,可以在您的服务中“重新实现”ADFS,但如果您这样做,您将不会获得 SSO。当您使用联合时,您会将用户重定向到其公司的 ADFS 服务器。此 ADFS 服务器与他的计算机在同一个域中,因此用户在此处获取 SSO。同样,如果您自己对用户进行身份验证,您的用户将无法获得 SSO,因为您的用户与您的站点不在同一个安全区域中。

【讨论】:

    【解决方案2】:

    向多个身份提供者进行身份验证时,通常重定向到your own STS。因此,在这种情况下,您会将 www.yourapp.com 重定向到 sts.yourapp.com,后者会重定向到 sts.somecustomer.com。

    启用此类数据流的特定工具是 home realm parameter (whr) 和 AD FS Powershell API(以允许 IDP 维护)。

    您的 RP-STS 充当应用的信任点,并管理适当 IDP 的选择。一个 RP-STS,多个 IP-STS。您客户的每个 IP-STS 都在 AD FS 中设置为声明提供者信任。

    与往常一样,Vittorio 已经covered the subject 比我做得更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-30
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 2014-12-23
      相关资源
      最近更新 更多