对不同的ADFS服务使用WIF

时间:2013-10-17 11:42:16

标签: asp.net wif adfs

我试图搜索这个,但没有找到任何好的答案,所以我会在这里提出一个问题!

我有一个网站,几个不同的客户想要使用他们的ADFS自己的服务访问。我的计划是在集中存储(而不是配置文件)中连接到不同的ADFS服务,并根据客户提供给网站的一些参数检索正确的服务,并将其与代码一起使用。

但是,我找不到任何方法让一个网站使用多个联合服务。这种方法是否可以使用WIF和ADFS?如果是,你有任何关于如何做的链接或例子吗?

1 个答案:

答案 0 :(得分:2)

这是可能的,您需要根据不同的用户选择创建不同的请求。

我的做法是在应用程序的某处(在登录页面上)有一堆按钮/链接。每个按钮专用于一个外部STS(在您的情况下为ADFS)。单击该按钮会向服务器创建wsignin1.0请求,当ADFS返回登录页面时,应该有一段代码尝试使用响应(SAML令牌)并为当前会话创建标识。

过去这更容易,因为WIF支持wif:FederatedPassiveSignIn网络控件。所有你需要的只是你的页面上的这些,每个单独的控件poiting到它的ADFS:

 <wif:FederatedPassiveSignIn id="adfs1" runat="server" Issuer="https://adfs1.adfs/adfs/ls" Realm="https://yourapp/loginpage.aspx" ImageUrl="adfs1.png/>
 <wif:FederatedPassiveSignIn id="adfs2" runat="server" Issuer="https://adfs2.adfs/adfs/ls" Realm="https://yourapp/loginpage.aspx" ImageUrl="adfs2.png" />

但是,由于某些未知原因,控件已从.NET 4.5版本的WIF中删除,因此使这更加困难。几个月前,我为.NET 4.5重新创建了这个代码,代码可以免费获得:

http://code.google.com/p/net45federatedpassivesignin/

如果您不想使用它(例如,因为您使用的是MVC和/或您不喜欢Web控件),您仍然可以深入研究代码以查看特定控件的ID如何传递给选定的ADFS,以便当响应来自ADFS时,只有源控件(发送请求的控件)会使用它(这涉及使用wctx请求的wsignin1.0可选参数。 / p>

编辑:您可能考虑的另一个选项是让单个ADFS扮演依赖STS的角色。在这样的环境中,您的应用程序会与单个adfs进行对话,并且此adfs与其他一些adfses联合在一起。这更容易设置,因为它只需要适当的配置。尝试进行身份验证的用户将重定向到依赖的adfs,并且adfs会显示HomeRealmDiscovery页面,用户从列表中选择目标adfs并进行身份验证。