2014-09-26 32 views
0

我的方案是这样的:我的应用程序中有一个Http Authentication请求,它返回将用于后续Http请求的访问令牌。
我可以同时执行多个请求,但他们需要一个有效的访问令牌,所以在每次请求之前我都会检查访问令牌是否有效。
如果它不存在或无效,我必须创建另一个身份验证请求来检索新的访问令牌。问题在于,每个其他请求必须在执行之前等待此请求的答案。另外,我不能同时运行两个身份验证请求,新的执行前必须等待旧的完成。

放入请求任务暂停,直到其他一些请求任务完成,然后恢复它们

那么,我怎么能有一个请求集合,我可以说:“如果访问令牌无效等待这个新的身份验证请求,我会做,然后再执行您的请求”?

+0

其他请求等待当前成功请求的条件很奇怪。我可以想到十几种方法来欺骗你的身份验证或打开网站。 *标准*认证方法有什么问题?在发明新的方形轮之前,你先看过它们吗? – oleksii 2014-09-26 09:53:38

+0

这就是我的应用程序的运行方式,身份验证请求与其他身份验证请求不同,因此我无法让一个正常请求从服务器返回新的访问令牌,因此需要为新令牌调用新的身份验证。 – 2014-09-26 10:11:18

+1

我会敦促你重新考虑你试图发展的东西。不要推出自己的安全。搜索“c#authentication <你的服务器端技术>”,例如:“c#authentication asp.net web api”。阅读它,它就在那里并实施。你只需要把它连接起来并正确使用。 – oleksii 2014-09-26 12:02:08

回答

1

这是很容易推出自己的类型,这将根据您的要求管理访问令牌的生命周期:

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即可为您获取新的有效标记,或者吐出已缓存的标记。如果您知道在应用程序中只需要一个实例,则可以将该管理器作为单例实现。

相关问题