这是很容易推出自己的类型,这将根据您的要求管理访问令牌的生命周期:
class AccessTokenManager
{
private readonly SemaphoreSlim Mutex = new SemaphoreSlim(1, 1);
private AccessToken LastSeenToken;
public async Task<AccessToken> ResolveToken(CancellationToken ct)
{
await this.Mutex.WaitAsync(ct);
try
{
if (this.LastSeenToken == null || !this.LastSeenToken.IsValid)
{
this.LastSeenToken = await this.GetNewAuthTokenAsync(ct);
}
return this.LastSeenToken;
}
finally
{
this.Mutex.Release();
}
}
private async Task<AccessToken> GetNewAuthTokenAsync(CancellationToken ct)
{
// Pure retrieve new token implementation.
}
}
注:ConfigureAwait(false)
不再赘述。
然后,无论何时您需要有效的标记(大概是在每个请求的开始处),您只需使用await AccessTokenManagerInstance.ResolveToken
即可为您获取新的有效标记,或者吐出已缓存的标记。如果您知道在应用程序中只需要一个实例,则可以将该管理器作为单例实现。
其他请求等待当前成功请求的条件很奇怪。我可以想到十几种方法来欺骗你的身份验证或打开网站。 *标准*认证方法有什么问题?在发明新的方形轮之前,你先看过它们吗? – oleksii 2014-09-26 09:53:38
这就是我的应用程序的运行方式,身份验证请求与其他身份验证请求不同,因此我无法让一个正常请求从服务器返回新的访问令牌,因此需要为新令牌调用新的身份验证。 – 2014-09-26 10:11:18
我会敦促你重新考虑你试图发展的东西。不要推出自己的安全。搜索“c#authentication <你的服务器端技术>”,例如:“c#authentication asp.net web api”。阅读它,它就在那里并实施。你只需要把它连接起来并正确使用。 – oleksii 2014-09-26 12:02:08