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