我正在使用新的4.5 WIF内容对网站的用户进行身份验证,并保护我的MVC网站和WCF服务之间的通信。
我已将网站配置为保存引导上下文,以便可以对对服务层的所有请求重复使用相同的安全 token 。
在正常情况下,每个网站请求都已通过身份验证,并且可以通过上下文使用SecurityToken来保护WCF调用,它们都可以正常工作。
但是,如果网站应用程序域被重置(例如,在开发过程中构建应用程序),则对该网站的任何请求仍将通过身份验证,但SecurityToken在上下文中不再可用以传递给WCF调用。
调试 BootstrapContext
它具有4个有用的属性:
SecurityToken
SecutiryTokenHandler
Token
TokenBytes
应用前域重置SecurityToken和SecurityTokenHandler具有值,而重置后Token具有值。
重置后,盯着Token的值似乎是原始的SAML XML,因此我大概可以从中重新补充完整的SecutiryToken,但这似乎是奇怪的行为,我找不到任何文档。
有什么想法可以做以确保SecurityToken始终可用,以免使我迷惑于 token XML?
更新
使用dotPeek来查看框架源代码中发生了什么,我可以看到导致这种行为的执行路径,但是我无法确定为什么需要这种方式以及如何避免这种情况的任何原因。
最后,我放弃了尝试解决问题的方法,现在使用以下代码来确保我拥有 token
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)));
}
我现在担心的是,我错过了这种行为背后的原因,而我的上述修正将在某个时候爆发。
最佳答案
我偶然发现了同样的问题。
我看到 token 具有 token 的XML表示,而SecurityToken为null。
我还注意到,杀死w3wp.exe确实很容易复制该文件。