当前位置:  开发笔记 > 后端 > 正文

使用Geneva Framework创建本地令牌缓存

如何解决《使用GenevaFramework创建本地令牌缓存》经验,为你挑选了1个好方法。

还没有看到许多与日内瓦有关的问题,我也在日内瓦论坛上发布了这个问题......

我正在开发一个场景,我们有一个带有广泛安装基础的win form应用程序,它将在我们的整个操作过程中频繁地调用我们集中托管的各种服务.

这些服务都使用日内瓦框架,并且所有客户都应首先致电我们的STS以获得令牌以允许访问服务.

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

或者,我已经实现了从应用程序"手动"检索令牌所需的代码,然后在调用服务上的操作时传递相同的预先检索的令牌(基于WSTrustClient示例和助手论坛); 效果很好,所以我们确实有一个解决方案,但我相信它不是很优雅,因为它需要在代码中构建WCF通道,远离美妙的WCF配置.

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

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

通过这种方式,我认为我们可以实现两全其美 - 在没有服务特定的自定义代码的情况下缓存令牌; 我们的缓存应该能够处理所有RP的令牌.

我已经创建了一个非常简单的原型,看看它是否有效,并且 - 不幸的是有点不足为奇 - 我有点卡住了 -

我的本地服务(当前是一个控制台应用程序)获取请求,并且 - 第一次 - 调用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 = "p@ssw0rd"; 
            //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;

Yossi Dahan.. 6

这几乎令人尴尬,但多亏了Dominick Baier在论坛上我现在还没有意识到我错过了一个重点(我知道它没有意义!老实说!:-)) -

一个令牌每个服务代理被检索一次,假设它没有过期,所以我需要做的就是重用相同的代理,我打算不管怎么做,但是,相当愚蠢,没有在我的原型上.

另外 - 我在MSDN WCF样本上发现了一个非常有趣的示例 - Durable Issued Token Provider,如果我理解正确的话,它会在客户端使用自定义端点行为来实现令牌缓存,这非常优雅.

我仍然会看到这种方法,因为我们有几个服务,因此我们可以通过在代理之间重用相同的令牌来实现更高的效率.

所以 - 两个解决方案,几乎是我的眼睛; 希望我的愚蠢在某些方面帮助某人!



1> Yossi Dahan..:

这几乎令人尴尬,但多亏了Dominick Baier在论坛上我现在还没有意识到我错过了一个重点(我知道它没有意义!老实说!:-)) -

一个令牌每个服务代理被检索一次,假设它没有过期,所以我需要做的就是重用相同的代理,我打算不管怎么做,但是,相当愚蠢,没有在我的原型上.

另外 - 我在MSDN WCF样本上发现了一个非常有趣的示例 - Durable Issued Token Provider,如果我理解正确的话,它会在客户端使用自定义端点行为来实现令牌缓存,这非常优雅.

我仍然会看到这种方法,因为我们有几个服务,因此我们可以通过在代理之间重用相同的令牌来实现更高的效率.

所以 - 两个解决方案,几乎是我的眼睛; 希望我的愚蠢在某些方面帮助某人!

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有