我正在使用新的 4.5 WIF 东西来验证网站的用户并保护我的 MVC 网站和 WCF 服务之间的通信。
我将网站配置为保存引导上下文,以便我可以对服务层的所有请求重新使用相同的安全令牌。
在正常情况下,每个网站请求都经过身份验证并通过上下文提供 SecurityToken 以保护 WCF 调用,一切正常。
但是,如果网站应用程序域被重置(例如,在开发时构建应用程序),对网站的任何请求仍将被验证,但 SecurityToken 在上下文中不再可用以传递给 WCF 调用。
调试BootstrapContext
它有 4 个有用的属性:
SecurityToken
SecutiryTokenHandler
Token
TokenBytes
应用前域重置 SecurityToken 和 SecurityTokenHandler 有值,重置后 Token 有值。
在重置后目测 Token 的值,看起来这是原始的 SAML XML,所以我大概可以从中重新水化一个完整的 SecutiryToken 但这似乎很奇怪,我找不到任何文档。
有什么想法可以确保 SecurityToken 始终可用,以免我弄乱令牌 XML 吗?
更新
使用 dotPeek 查看框架源代码中发生的情况,我可以看到导致这种行为的执行路径,但我无法确定为什么需要这种方式以及如何避免这种方式的任何原因。
最后我放弃了尝试解决它,现在使用下面的代码来确保我有一个令牌
if (context.SecurityToken != null)
{
token = context.SecurityToken;
}
else if (context.Token.IsNotEmpty())
{
var handlers = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers;
token = handlers.ReadToken(new XmlTextReader(new StringReader(context.Token)));
}
我现在担心的是我错过了这种行为背后的一些推理,我上面的修复将在某个时候爆炸。