8

別の WCF STS サービスによって発行されたセキュリティ トークンを必要とする WCF サービスがあります。これはすべてうまく機能します。私のアプリケーションでは、次のようにサービスを使用します。

MyServiceClient myService = new MyServiceClient();
myService.Open();
myService.DoStuff();

STS サービスが呼び出されてトークンが取得され、そのトークンを使用してサービス メソッド DoStuff が呼び出されます。

ただし、最初のハンドシェイクが終了すると、myServiceオブジェクトはトークンをキャッシュし、有効期限が切れるまで再利用します。これは問題のない動作ですが、トークンを強制的に更新するにはどうすればよいですか?

myService.ClientCredentials.Invalidate(); // something like this?

DoStuff() をもう一度呼び出すと、最初に行ったのと同じように、STS に再度アクセスする必要があることがわかります。

新しいプロキシクラスオブジェクトを作成するだけで行き詰まっていmyService = new MyServiceClient();ますか? これは機能しますが、核爆弾の解決策のようです。

または、新しいトークンを手動で取得して現在のトークンを置き換える方法はありmyService.ClientCredentials.Renew();ますか?

これを行うためにカスタム ClientCredentials クラスを作成する必要がある場合、上記のサンプル メソッドをどのように実装しますか?

4

2 に答える 2

4

私のコードベースでは、実際にトークンをキャッシュして、STS を繰り返し呼び出さないようにしています。同じ方法を使用して、いつでも別のトークンを手動で要求するように変更できます。ClientCredentials にフックする方法は次のとおりです。

public class CustomClientCredentials : ClientCredentials
{
    public CustomClientCredentials()
    {
    }

    protected CustomClientCredentials(ClientCredentials other)
        : base(other)
    {
    }

    protected override ClientCredentials CloneCore()
    {
        return new CustomClientCredentials(this);
    }

    /// <summary>
    /// Returns a custom security token manager
    /// </summary>
    /// <returns></returns>
    public override  SecurityTokenManager CreateSecurityTokenManager()
    {
        return new CustomClientCredentialsSecurityTokenManager(this);
    }
}


public class CustomClientCredentialsSecurityTokenManager : ClientCredentialsSecurityTokenManager
{
    public CustomClientCredentialsSecurityTokenManager(ClientCredentials credentials)
        : base(credentials)
    {
    }

    /// <summary>
    /// Returns a custom token provider when a issued token is required
    /// </summary>
    public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement)
    {
        if (IsIssuedSecurityTokenRequirement(tokenRequirement))
        {
            // Adds the endpoint behaviors for calling the issuer
            IssuedSecurityTokenProvider baseProvider = (IssuedSecurityTokenProvider)base.CreateSecurityTokenProvider(tokenRequirement);

            CustomIssuedSecurityTokenProvider provider = new CustomIssuedSecurityTokenProvider(baseProvider);
            return provider;
        }
        return base.CreateSecurityTokenProvider(tokenRequirement);
    }
}


public class CustomIssuedSecurityTokenProvider : IssuedSecurityTokenProvider
{
    private readonly IssuedSecurityTokenProvider _innerProvider;

    public CustomIssuedSecurityTokenProvider(IssuedSecurityTokenProvider innerProvider)
    {
        _innerProvider = innerProvider;
        CacheIssuedTokens = innerProvider.CacheIssuedTokens;
        IdentityVerifier = innerProvider.IdentityVerifier;
        IssuedTokenRenewalThresholdPercentage = innerProvider.IssuedTokenRenewalThresholdPercentage;
        IssuerAddress = innerProvider.IssuerAddress;
        IssuerBinding = innerProvider.IssuerBinding;
        innerProvider.IssuerChannelBehaviors.ForEach(IssuerChannelBehaviors.Add);
        KeyEntropyMode = innerProvider.KeyEntropyMode;
        MaxIssuedTokenCachingTime = innerProvider.MaxIssuedTokenCachingTime;
        MessageSecurityVersion = innerProvider.MessageSecurityVersion;
        SecurityAlgorithmSuite = innerProvider.SecurityAlgorithmSuite;
        SecurityTokenSerializer = innerProvider.SecurityTokenSerializer;
        TargetAddress = innerProvider.TargetAddress;
        innerProvider.TokenRequestParameters.ForEach(TokenRequestParameters.Add);

        _innerProvider.Open();
    }

    ~CustomIssuedSecurityTokenProvider()
    {
        _innerProvider.Close();
    }

    protected override SecurityToken GetTokenCore(TimeSpan timeout)
    {
        // We're ignoring the CacheIssuedTokens property in order to force an STS call
        var securityToken = _innerProvider.GetToken(timeout);
        return securityToken;
    }
}

GetTokenCore() メソッドは、STS が呼び出される場所です。GetToken() を呼び出すと、STS は別のトークンを発行するように求められます。

あなたの質問から、app.config から ClientCredentials にフックする方法を知っていると思います。

App.config ファイルで CacheIssuedTokens プロパティを設定する方法があるかもしれません。

于 2010-11-16T16:23:33.387 に答える
1

IssuedToken.MaxIssuedTokenCachingTimeプロパティを使用せずに 0 に設定していただけないでしょうか。

于 2010-11-12T07:59:40.133 に答える