24

我正在使用新的 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)));
}

我现在担心的是我错过了这种行为背后的一些推理,我上面的修复将在某个时候爆炸。

4

3 回答 3

4

我偶然发现了同样的问题。我看到令牌具有令牌的 xml 表示并且 SecurityToken 为空。我还注意到这很容易通过杀死 w3wp.exe 来重现。

于 2013-03-04T14:14:37.583 回答
1

我已经通过删除包括 Fedauth cookie 的浏览器 cookie 解决了这个问题。再次调试后,我能够获得所有需要的值

于 2014-12-23T13:52:37.523 回答
0

当我实现微软的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 提供的解决方法!

于 2014-03-17T09:51:51.480 回答