gpt4 book ai didi

wcf - 如何强制刷新 WCF 服务的安全 token ?

转载 作者:行者123 更新时间:2023-12-04 08:29:52 26 4
gpt4 key购买 nike

我有一个 WCF 服务,它需要一个由单独的 WCF STS 服务颁发的安全 token 。这一切都只是花花公子。在我的应用程序中,我像这样使用服务:

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

调用 STS 服务获取 token , token 用于调用服务方法 DoStuff。

但是,一旦初始握手结束, myService对象缓存了 token 并重新使用它,直到它过期。这是很好的行为,但我如何强制它刷新 token ?
myService.ClientCredentials.Invalidate(); // something like this?

这样,如果我再次调用 DoStuff(),它就会知道它需要像第一次那样再次进入 STS。

我是否只是创建一个新的代理类对象,即 myService = new MyServiceClient(); ?这有效,但似乎是核弹解决方案。

或者,有没有办法手动获取新 token 并替换当前 token ,即 myService.ClientCredentials.Renew(); ?

如果我必须创建一个自定义 ClientCredentials 类来执行此操作,我将如何实现上述示例方法?

最佳答案

在我的代码库中,我们实际上缓存了 token ,因此我们确保不会重复调用 STS。使用相同的方法,您绝对可以随时更改它手动请求另一个 token 。以下是 Hook 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 发出另一个 token 。

根据您的问题,我假设您知道如何从 app.config 连接到您的 ClientCredentials。

可能有一种方法可以在 App.config 文件中设置 CacheIssuedTokens 属性,我只是不确定是否有办法。

关于wcf - 如何强制刷新 WCF 服务的安全 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4138525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com