我应该在哪里存储过期的REST API身份验证令牌?

时间:2018-06-13 21:48:37

标签: c# rest oauth-2.0

我们有一个OAuth API,它提供过期令牌来验证我们应用程序中的REST API。

我想要实现的目标

当第一个请求通过时,应用程序在服务器上运行,从OAuth API获取到期令牌,到期日期并在应用程序中存储并使用该令牌直到该到期日期并在此之后请求另一个令牌。此令牌应该在整个应用程序中全局使用,直到它过期。

我做了什么

设置一个方法,该方法将从Oauth API获取令牌,并将其作为具有到期日期的应用程序设置写入web.config文件。每当请求到达REST API时,它将检查令牌是否可用且未从web.config过期并返回令牌。如果令牌不可用或已过期,它将从OAuth API获取新令牌。

的Web.Config

<appSettings>
<add key="Token" value="" />
<add key="ExpiryDate" value="" />
</appSettings>

CS档案

public RESTAPI GetData()
{
string Token = GetToken();
//use this Token to Authenticate REST API
}

public string GetToken()
{
string Token = ConfigurationManager.AppSettings["Token"];
DateTime ExpiryDate = DateTime.parse(ConfigurationManager.AppSettings["ExpiryDate"]);
if(Token == "" || ExpiryDate<=DateTime.now)
  {
   RefreshToken();
  }
return ConfigurationManager.AppSettings["Token"];
} 

public void RefreshToken()
{
//Consider OauthObject as object returned from Oauth API with Token and expiry date
ConfigurationManager.AppSettings["Token"] = OauthObject.Token;
ConfigurationManager.AppSettings["ExpiryDate"] = OauthObject.ExpiryDate.toString();
}

我希望在应用程序中为所有用户分发一个令牌,直到它过期为止。如果我想这样做,它会这样工作吗?或者任何其他建议。

注意:用C#编写的ASP.Net Web应用程序。

2 个答案:

答案 0 :(得分:0)

我不确定您为什么要首先存储访问令牌。为什么不将令牌保留在内存中而有效?

根据您所写的内容,您似乎希望自己的应用程序代表自己为任何用户行事。在这种情况下,OAuth2 client credentials flow是您的最佳选择。

此外,最好只使用令牌,直到API返回HTTP 401错误,然后续订令牌并重试API。如果存储到期时间,则必须考虑计算机之间的时钟偏差。已颁发的令牌可能已加密,在这种情况下,您无法获得到期时间。

答案 1 :(得分:0)

对于.Net Core,您可以使用IMemoryCache接口将身份验证令牌存储在内存中,可以使用内置的DI容器轻松将其注入到消费者服务中。

这样,您只能将其存储在内存中与Expires_in相关的过期时间,因此之后它将被自动删除。

class RestConsumerService
{
    private readonly IMemoryCache _memoryCache;
    RestConsumerService(IMemoryCache memoryCache)
    {
         _memoryCache = memoryCache
    }
    string GetOAuthToken()
    {
        if (_memoryCache.TryGetValue<string>("MyTokenKey", out string access_token)) //You can store the T object as well.
        {
            return access_token;
        }

        //Do Api OAuth call
        //...
        OAuthRespone response = fetchAccessToken();

        _memoryCache.Set("MyTokenKey", response.Access_token, new TimeSpan(0, 0, result.Expires_in));

        return response.Access_token;
    }
}