WIF 4.5 BootstrapContext安全令牌null

时间:2012-11-22 14:14:25

标签: .net wcf security wif saml

我正在使用新的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背后的一些推理,我上面的解决方案会在某些时候爆发。

3 个答案:

答案 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的解决方法!