ctb*_*ctb 6 c# authentication adfs .net-4.5
我有一个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中进行主动身份验证?
到目前为止,我最好的想法是检查用户 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());
Run Code Online (Sandbox Code Playgroud)
当然,我可以使用适当的 .HomeRealm 值或 .AuthenticationType 调整该请求,以便跳过 HRD 流程,然后,它们将被发送回经过身份验证并具有正确声明身份的应用程序。
这对我来说不是完美答案的原因之一是,如果用户以前从未登录过,或者禁用了 cookie,并且根据联盟的不同,他们可能需要登录两次。也就是说,一次访问应用程序的登录表单,一次访问 ADFS 表单。这就是为什么我希望能够以某种方式以编程方式发送请求而不是重定向。这样我就可以发送应用程序已经收集的用户名和密码,而不必在 ADFS 中再次收集它们。
因此,我不会将此标记为答案。我愿意坚持下去,争取更好的。