ADFS Active Authentication .NET 4.5(后WIF)

时间:2014-02-26 22:22:40

标签: c# authentication .net-4.5 adfs

我有一个ASP.NET Web应用程序(在.NET 4.5上运行)。它目前正在进行表单身份验证。我们已经设置了一个具有多个联合的ADFS 3服务器,一些是内部的,一些是外部的(客户STS),我们希望将Web应用程序配置为使用主动身份验证模型。如果我理解正确,这意味着我们将继续在我的Web应用程序中使用登录表单,它将从用户收集凭据,然后向我们的ADFS服务器发送安全令牌请求。令牌请求可能会告诉ADFS将请求发送到哪个联合。如果一切都成功,那么我从ADFS获取一个令牌,验证它,并构建一个ClaimsPrinciple并从那里开始。

现在,在此背景下,我遇到的问题是如何将令牌请求发送到.NET 4.5中的ADFS。我看到的每个例子,尽管被标记为适用于.NET 4.5,都使用来自WIF的旧UserNameWSTrustBinding类。这已弃用,4.5中不存在。网络搜索“UsernameWSTrustBinding 4.5等效”没有结果。我见过一个人构建自己的类来复制功能,但我不相信这是必要的。我有一个预感,这里有一个类,我应该用于WSTrustChannelFactory中的绑定,但我找不到它。或者,整个WSTrustChannelFactory模式也可能过时(但为什么它会包含在.NET 4.5中)?

任何人都可以提供一段代码,甚至可以说明你应该如何在.NET 4.5中进行主动身份验证?

1 个答案:

答案 0 :(得分:1)

到目前为止,我最好的想法是检查用户cookie中的用户名(如果存在),或者在cookie不存在时从常规登录表单中检查用户名。有了这些信息,我可以确定是否需要将其发送到IdP。如果需要将其发送到IdP,我可以构建请求URL并重定向。

WSFederationAuthenticationModule instance = FederatedAuthentication.WSFederationAuthenticationModule;
SignInRequestMessage request = instance.CreateSignInRequest(Guid.NewGuid().ToString(), instance.Realm, true);
request.AuthenticationType = "urn:federation:authentication:windows";
Response.Redirect(request.WriteQueryString());

当然,我可以使用相应的.HomeRealm值或.AuthenticationType调整该请求,以便跳过HRD流程,之后,它们将被发送回经过身份验证且具有适当声明权限的应用。< / p>

这对我来说不是完美答案的一个原因是,如果用户以前从未登录过,或者已禁用cookie,并且取决于联盟,则他们有可能拥有登录两次。也就是说,一次到应用程序的登录表单,一次到ADFS表单。这就是为什么我希望能够以某种方式以编程方式发送请求而不是重定向。这样我就可以发送用户名&amp;应用程序已收集的密码,无需在ADFS再次收集它们。

因此,我不会将此标记为答案。我想更好地坚持下去。