WCFサービスのセキュリティトークンの更新を強制するにはどうすればよいですか?
-
30-09-2019 - |
質問
私は、別のWCF STSサービスによって発行されたセキュリティトークンを必要とするWCFサービスを持っています。これはすべてダンディだけです。私のアプリケーションでは、次のようにサービスを使用します。
MyServiceClient myService = new MyServiceClient();
myService.Open();
myService.DoStuff();
STSサービスはトークンを取得するために呼び出され、トークンはサービスメソッドドスタフを呼び出すために使用されます。
しかし、最初の握手が終わったら、 myService
オブジェクトにはトークンがキャッシュされており、有効期限が切れるまで再利用します。これは素晴らしい動作とすべてですが、どうすればよいですか 力 トークンを更新するのは?
myService.ClientCredentials.Invalidate(); // something like this?
私が再びdostuff()に電話した場合、初めて行ったのと同じように、再びSTSに行く必要があることがわかっています。
新しいプロキシクラスオブジェクトを作成するだけで立ち往生していますか? myService = new MyServiceClient();
?これは機能しますが、核爆弾解決策のようです。
または、新しいトークンを手動で取得して現在のトークンを交換する方法はありますか? myService.ClientCredentials.Renew();
?
これを行うには、Custom ClientCredentialsクラスを作成する必要がある場合、上記の例をどのように実装しますか?
解決
私のコードベースでは、実際にトークンをキャッシュするため、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プロパティを設定する方法があるかもしれませんが、頭の上から外れているわけではありません。
他のヒント
使用できません IssuedToken.MaxIssuedTokenCachingTime
プロパティと0に設定しますか?