2008-12-30 30 views
5

本地令牌缓存有没有看到很多日内瓦相关的问题的是,我已经张贴在Geneva Forum以及这个问题...创建使用日内瓦框架

我的工作,我们有一个场景赢得一个广泛的安装基地的表格应用程序,这个应用程序会在整个操作过程中频繁地向我们托管的各种服务发出呼叫。

这些服务都使用Geneva Framework,所有客户都需要首先给我们的STS发送一个令牌以允许访问服务。

开箱即用,使用ws2007FederationHttpBinding,应用程序可以配置为在每次服务调用之前从STS检索一个令牌,但显然这不是最有效的方式,因为我们几乎重复调用服务。

或者,我已经实现了从应用程序“手动”检索令牌所需的代码,然后在调用服务操作时(基于WSTrustClient样本和helpon论坛)传递相同的预检索的令牌;这很好,所以我们确实有一个解决方案,但我认为它不是很优雅,因为它需要在代码中构建WCF通道,而不是从美妙的WCF配置中移除。

我更喜欢ws2007FederationHttpBinding方法,其中客户端只需像任何其他WCF服务一样调用服务,而无需了解日内瓦的任何信息,并且绑定负责处理令牌交换。

然后有人(乔恩辛普森)给了我[我认为是]一个好主意 - 添加一个服务,托管在应用程序本身来缓存本地检索的令牌。 本地缓存服务将执行与STS相同的合同;当接收到一个请求时,它会检查是否存在一个cahced标记,如果是的话会返回它,否则它会调用'真正的'STS,取回一个新的标记,缓存并返回它。 然后,客户端应用程序仍然可以使用ws2007FederationHttpBinding,但不是将STS作为发行者,而是使用本地缓存;

这种方式我认为我们可以实现两全其美 - 无需服务定制代码缓存代币;我们的缓存应该能够处理所有RP的令牌。

我创建了一个非常简单的原型,看看它的工作原理,以及 - 有些并不奇怪遗憾的是 - 我稍微卡住 -

我的本地服务(目前一个控制台应用程序)获取请求,并且 - 第一次around - 调用STS检索令牌,将其缓存并成功将其返回给客户端,随后使用它来调用RP。一切运作良好。

第二次左右,不过,我的本地cahce服务试图再次使用同样的道理,但在客户端失败,出现MessageSecurityException -

“安全处理器是无法找到消息中的安全头这可能是因为该消息是一个不安全的错误,或者是因为通信双方之间存在绑定不匹配的情况。如果该服务配置了安全性并且客户端没有使用安全性,则会发生这种情况。“

是否有某些东西阻止同一令牌被多次使用?我对此表示怀疑,因为当我根据WSTrustClient示例重用令牌时,它运行良好;我错过了什么?我的想法可能吗?一个好的?

这里的(很基本的,在这个阶段)本地缓存的主要代码位 -

static LocalTokenCache.STS.Trust13IssueResponse cachedResponse = null; 
    public LocalTokenCache.STS.Trust13IssueResponse Trust13Issue(LocalTokenCache.STS.Trust13IssueRequest request) 
    { 
     if (TokenCache.cachedResponse == null) 
     { 
      Console.WriteLine("cached token not found, calling STS"); 
      //create proxy for real STS 
      STS.WSTrust13SyncClient sts = new LocalTokenCache.STS.WSTrust13SyncClient(); 
      //set credentials for sts 
      sts.ClientCredentials.UserName.UserName = "Yossi"; 
      sts.ClientCredentials.UserName.Password = "[email protected]"; 
      //call issue on real sts 
      STS.RequestSecurityTokenResponseCollectionType stsResponse = sts.Trust13Issue(request.RequestSecurityToken); 
      //create result object - this is a container type for the response returned and is what we need to return; 
      TokenCache.cachedResponse = new LocalTokenCache.STS.Trust13IssueResponse(); 
      //assign sts response to return value... 
      TokenCache.cachedResponse.RequestSecurityTokenResponseCollection = stsResponse; 
     } 
     else 
     { 
     } 
     //...and reutn 
     return TokenCache.cachedResponse; 

回答

6

这几乎是尴尬的,但由于多米尼克·拜尔在论坛上,我没有现在意识到我已经错过了一个巨大的观点(我知道它没有道理!老实说!:-)) -

令牌每个服务代理获取一次,假设它没有过期,所以我需要做的就是重用同样的代理,我打算做任何事情,但是,很愚蠢,没有在我的原型上。另外 - 我在MSDN WCF示例 - Durable Issued Token Provider上找到了一个非常有趣的示例,如果我理解正确,它会在客户端使用自定义端点行为来实现令牌缓存,这非常优雅。

由于我们有多个服务,所以我仍然会看这种方法,所以我们可以通过在其代理之间重复使用相同的令牌来实现更高的效率。

所以 - 两种解决方案,非常适合我的眼睛;希望我的愚蠢在某个时候帮助别人!

+0

没有什么是愚蠢的 - 如果一个属于这一差距则会有更多。向上投票给你的问题和实际回到这个答案。是的,为你。 – 2008-12-30 20:48:24