一次刷新accessToken的最佳方法

时间:2018-08-23 08:03:43

标签: c# api .net-core locking jwt

我想从我的ASP.NET Core应用程序中使用通过某种令牌身份验证来保护的API。 由于获取令牌的过程需要相当长的时间(而且我认为不必要多次设计是很糟糕的设计),因此我想确保获取令牌的API调用在没有令牌的情况下仅执行一次,或者过期。

这是我的做法: 我创建了一个新服务并将其注册为单例

compilation debug="true"

服务本身看起来像这样

   services.AddSingleton<IService, Service>();

这似乎可行,但是我认为应该有一种更优雅的方式来管理它。你们如何处理这个问题?

2 个答案:

答案 0 :(得分:0)

您可以为此使用缓存。将其策略的AbsoluteExpiration设置为ValidTo(最好使用较小的偏移量),一旦过期,它将自动被驱逐。像这样:

private readonly ObjectCache _cache = MemoryCache.Default;

public T GetToken()
{
    if (!_cache.Contains("token"))
    {
        GetAndCacheNewToken();
    }

    return _cache.Get("token") as T;
}

public void GetAndCacheNewToken()
{
    T token;

    // Get your token.

    _cache.Add(
        "token", 
        token, 
        new CacheItemPolicy() {AbsoluteExpiration = token.ValidTo.AddSeconds(-1)});
}

我将令牌的类型标记为T,因为我不知道它在您的应用程序中是什么类型。

答案 1 :(得分:0)

嘿@askingdumbquestions,欢迎来到社区

您最初的方法很有意义,但有一些缺点:

  1. 遇到过期令牌的请求会导致常规性能下降,因为它将在同一进程中获取。
  2. 由于请求可以并行处理-可能是多个请求遇到过期的令牌并获取新的令牌。根据并行运行的请求数量,这很容易导致您潜在的慢速身份验证服务中断-这不是您所希望的!是的:这可以通过围绕累进检查和获取令牌的简单互斥对象来解决。这将导致大量锁定和任务彼此等待,以及导致必须获取令牌的一项任务! (获取令牌时,所有请求都将/必须被阻止)。

但是还有另一种方法:第一次构造Service时,您要获取令牌,然后启动一个异步任务,该任务将在令牌过期前几分钟获取/刷新令牌!这样可以确保您始终准备好有效的令牌,并且不必进行昂贵且容易出错的线程同步,并消除了其他恶习必须获取令牌的那些请求的延迟峰值。

让我知道这是否有帮助,或者您需要更详细的说明!