网站可以针对多个ADFS服务器进行身份验证吗?

时间:2016-07-28 20:08:39

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

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

现在销售人员正在发出关于"单点登录"的声音,尽管我并不清楚它们究竟是什么意思。根据我的阅读,在Microsoft World中,这通常意味着访问MS的Active Directory联合身份验证服务。

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

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

我看到的关于Single Sign-On的大部分内容似乎都涉及将浏览器重定向到ADFS服务器,然后重定向,并且如果您已经登录,则看起来完全避免登录.I在我们的案例中,我们认为我们无法做到这一点。在我们访问数据库之前,我们无法知道要重定向到哪个ADFS服务器。

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

(一种可能的复杂情况 - 网站本身无法访问任何数据库。其web.config中的唯一配置设置是webservice的基本URL。无论身份验证发生在Web服务中,而不是在网站中。 )

2 个答案:

答案 0 :(得分:1)

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

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

然后关于你的特定问题:

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

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

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

答案 1 :(得分:1)

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

Diagram showing RP-STS

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

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

与往常一样,维托里奥已经covered the subject比我更好了。

Image showing two IP-STSs authenticating to single RP-STS, with a single RP