这是您提出的一个有趣的问题。我知道无论出于何种原因,微软在没有太多文档的情况下推出了这个“Windows Identity Foundation”框架。我知道这一点是因为我的任务是弄清楚如何将它用于新项目并将其与现有基础架构集成。几个月来我一直在网上搜索,寻找好的信息。
我对解决您描述的问题采取了不同的角度。
我采用了一个现有的登录应用程序并将 Microsoft 的 WIF 管道集成到其中。我的意思是我有一个用户登录的应用程序。登录应用程序将用户提供的凭据提交到另一个服务器,该服务器返回用户身份(或指示登录失败)。
查看 Microsoft 的一些示例,我发现它们执行以下操作:
从查询字符串(由依赖方应用程序生成)构造SignInRequestMessage,从自定义类构造安全令牌服务,最后使用当前的 httpcontext.response 调用 FederatedSecurityTokenServiceOperations.ProcessSignInresponse。不幸的是,我不能在这里很好地解释它;您确实需要查看代码示例。
我的一些代码与代码示例非常相似。在GetOutputClaimsIdentity 中,您将对实现很多自己的逻辑感兴趣。这是构造描述登录用户的声明身份的函数。
现在,这就是我认为您真正有兴趣了解的内容。这是微软在他们的文档 AFAIK 中没有告诉你的。
一旦用户登录,他们就会被重定向回依赖方应用程序。无论登录应用程序如何工作,WIF 类都会向用户的浏览器发送一个响应,其中包含一个“隐藏的”HTML 输入,其中包含令牌签名证书和用户的声明。 (声明将采用明文形式)。在此响应的末尾是重定向到您的依赖方网站。我只知道这个动作,因为我用“Fiddler”捕获它
返回依赖方网站后,WIF 类将处理响应(在您的任何代码运行之前)。证书将被验证。默认情况下,如果您使用 FedUtil.exe 设置您的信赖方网站(通过在 Visual Studio 中单击“在您的信赖方应用程序中添加 STS 引用),Microsoft 的类将验证证书指纹。
最后,WIF 框架在用户浏览器中设置包含用户声明的 cookie(根据我的经验,cookie 名称以“FedAuth”开头)。 Cookie 不是人类可读的。
一旦发生这种情况,您可以选择使用ClaimsAuthenticationClass 在依赖方网站内对用户的声明执行操作。这是您的代码再次运行的地方。
我知道这与您所描述的不同,但我可以使用此设置。我希望这会有所帮助!
ps。请查看我就 Windows Identity Foundation 提出的其他问题。
更新:在下面的评论中回答问题:
我遗漏的一件事是重定向到 STS 登录应用程序是通过使用包含用户正在登录的应用程序 URL 的查询字符串的重定向发生的。当用户第一次尝试访问需要身份验证的页面时,此重定向会自动发生。或者,我相信您可以使用 WSFederationAuthentication 模块手动进行重定向。
我从未尝试过这样做,但如果您想在应用程序本身中使用登录页面,我相信框架应该允许您使用以下内容:
1) 将您的 STS 代码封装在一个库中。
2) 从您的应用程序中引用该库。
3) 在您的应用程序中创建一个登录页面。确保此类页面不需要身份验证。
4) 将 web.config 的 Microsoft.IdentityModel 部分中的 wsFederation 元素的 issuer 属性设置为登录页面。