質問

ジュネーブに関連する質問はまだ多くありません。ジュネーブフォーラムも...

私は、幅広いインストールベースを備えたwinフォームアプリを使用するシナリオに取り組んでいます。このアプリは、運用中に集中的にホストされているさまざまなサービスに頻繁に呼び出しを発行します。

サービスはすべてGenevaフレームワークを使用しており、すべてのクライアントはまずサービスへのアクセスを許可するトークンで発行されるSTSを呼び出すことが期待されています。

ws2007FederationHttpBindingを使用すると、各サービス呼び出しの前にSTSからトークンを取得するようにアプリを構成できますが、明らかに、これはサービス呼び出しの労力をほとんど複製しているため、最も効率的な方法ではありません。

代わりに、トークンを手動で取得するために必要なコードを実装しました。アプリから、サービスの操作を呼び出すときに同じ事前取得トークンを渡します(WSTrustClientサンプルとフォーラムのヘルプに基づく)。それはうまく機能するので解決策はありますが、すばらしいWCF構成から離れてコードでWCFチャネルを構築する必要があるため、あまりエレガントではないと思います。

私は、クライアントがジュネーブについて何も知らずに、他のWCFサービスと同様にサービスを呼び出すだけのws2007FederationHttpBindingアプローチを好んでおり、バインディングがトークン交換を処理します。

その後、誰か(ジョンシンプソン)が素晴らしいアイデアをくれました-アプリ自体にホストされているサービスを追加して、ローカルで取得したトークンをキャッシュします。 ローカルキャッシュサービスは、STSと同じコントラクトを実装します。要求を受信すると、cahcedトークンが存在するかどうかを確認し、存在する場合はそれを返し、そうでない場合は「実際の」STSを呼び出し、新しいトークンを取得し、キャッシュしてから返します。 クライアントアプリは引き続きws2007FederationHttpBindingを使用できますが、発行者としてSTSを使用する代わりに、ローカルキャッシュを使用します。

これにより、両方の長所を実現できると思います。サービス固有のカスタムコードなしでトークンをキャッシュできます。キャッシュはすべてのRPのトークンを処理できる必要があります。

非常に単純なプロトタイプを作成して、それが機能するかどうかを確認しました-残念ながら、少し驚くことではありません-少し立ち往生しています-

ローカルサービス(現在はコンソールアプリ)が要求を取得し、最初にSTSを呼び出してトークンを取得、キャッシュし、クライアントに正常に返します。クライアントはそれを使用してRPを呼び出します。すべてうまくいきます。

ただし、2回目は、ローカル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;
役に立ちましたか?

解決

これはほとんど恥ずかしいことですが、フォーラムのDominick Baierのおかげで、大きなポイントを見逃していることに気付いていません(意味をなさないことを知っていました!正直に!:-))-

トークンは有効期限が切れていないとサービスプロキシごとに1回取得されるため、必要なのは同じプロキシを再利用することだけでしたが、とにかく行う予定でしたが、かなり愚かではありませんでしたプロトタイプ。

さらに-MSDN WCFサンプルで非常に興味深いサンプルを見つけました-永続発行トークンプロバイダー。正しく理解できれば、クライアント側でカスタムエンドポイントの動作を使用してトークンキャッシュを実装します。これは非常にエレガントです。

複数のサービスがあるため、このアプローチを引き続き検討します。したがって、プロキシ間で同じトークンを再利用することで、さらに効率を上げることができます。

そう-2つの解決策、私の目はほとんど不自由です。私の愚かさがいつか誰かを助けることを願っています!

他のヒント

ここでトークンをキャッシュするための完全なサンプルを提供しました: http://blogs.technet.com/b/meamcs/archive/2011/11/20/caching-sts-security-token-with -an-active-web-client.aspx

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top