我正在使用新的4.5 WIF内容来验证网站用户的身份,并保护我的MVC网站和WCF服务之间的通信。
我已将网站配置为保存引导上下文,以便我可以对服务层的所有请求重复使用相同的安全令牌。
在正常情况下,一切正常,每个网站请求都经过身份验证,并且SecurityToken通过上下文提供,以保护WCF呼叫。
但是,如果重置网站应用程序域(例如,在开发时构建应用程序),对网站的任何请求仍将进行身份验证,但在上下文中不再提供SecurityToken以传递给WCF调用。
调试BootstrapContext
它有4个有用的属性:
SecurityToken
SecutiryTokenHandler
Token
TokenBytes
预应用域重置SecurityToken和SecurityTokenHandler具有值,并且重置后令牌具有值。
在重置之后注意Token的值它看起来像是原始的SAML XML,所以我可以从它重新整合一个完整的SecutiryToken,但这似乎是一种奇怪的行为,我找不到任何文档。
我可以做些什么来确保SecurityToken始终可以保存我使用令牌XML?
更新
使用dotPeek来查看框架源代码中的内容我可以看到导致此行为的执行路径,但我无法确定为何需要这样做以及如何进行avioded的任何原因。 / p>
最后我放弃了尝试解决问题,现在使用以下代码来确保我有一个令牌
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)));
}
我现在担心的是,我错过了这个behaiour背后的一些推理,我上面的解决方案会在某些时候爆发。
答案 0 :(得分:4)
我偶然发现了同样的问题。 我看到Token具有令牌的xml表示,而SecurityToken为null。 我还注意到通过杀死w3wp.exe很容易重现。
答案 1 :(得分:1)
我通过删除包含Fedauth cookie的浏览器cookie解决了这个问题。再次调试后,我能够获得所有需要的值
答案 2 :(得分:0)
当我从microsoft实现ClaimsAwareWebFarm示例时,我遇到了同样的问题。将此部分添加到web.config:
时会出现问题 <caches>
<sessionSecurityTokenCache type="CacheLibrary.SharedSessionSecurityTokenCache, CacheLibrary">
<!--cacheServiceAddress points to the centralized session security token cache service running in the web farm.-->
<cacheServiceAddress url="http://localhost/SecurityTokenCacheService/SessionSecurityTokenCacheService.svc" />
</sessionSecurityTokenCache>
</caches>
谢谢Matt的解决方法!