24

新しい4.5WIFを使用して、Webサイトのユーザーを認証し、MVCWebサイトとWCFサービス間の通信を保護しています。

サービスレイヤーへのすべてのリクエストに同じセキュリティトークンを再利用できるように、ブートストラップコンテキストを保存するようにWebサイトを構成しています。

通常の状態では、認証された各Webサイト要求ですべてが正常に機能し、WCF呼び出しを保護するためにコンテキストを介してSecurityTokenが使用可能になります。

ただし、Webサイトのアプリドメインがリセットされた場合(開発中にアプリをビルドする場合など)、Webサイトへの要求は引き続き認証されますが、WCF呼び出しに渡すコンテキストでSecurityTokenを使用できなくなります。

デバッグには、次のBootstrapContext4つの便利なプロパティがあります。

SecurityToken
SecutiryTokenHandler
Token
TokenBytes

アプリ前ドメインリセットのSecurityTokenとSecurityTokenHandlerには値があり、リセット後トークンには値があります。

リセット後のTokenの値を見ると、これは生のSAML XMLのように見えるので、おそらく完全なSecutiryTokenを再水和できますが、これはドキュメントが見つからない奇妙な動作のようです。

トークンXMLをいじくり回す手間を省くために、SecurityTokenを常に利用できるようにするために私ができることはありますか?

アップデート

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 が null であることがわかります。また、これは w3wp.exe を強制終了することで簡単に再現できることにも気付きました。

于 2013-03-04T14:14:37.583 に答える
1

Fedauth Cookie を含むブラウザの Cookie を削除することで問題を解決しました。もう一度デバッグすると、必要な値をすべて取得できました

于 2014-12-23T13:52:37.523 に答える
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 に感謝します。

于 2014-03-17T09:51:51.480 に答える