刷新令牌 - 服务器端存储和撤销多个客户端

时间:2016-08-07 16:02:20

标签: asp.net-web-api oauth oauth-2.0 asp.net-core aspnet-contrib

我开始使用ASOS(AspNet.Security.OpenIdConnect.Server)框架进行基于令牌的身份验证。

我已经完成了访问令牌的生成和检索,现在正在转移到刷新令牌位。

我的问题是:

  • 我应该如何存储刷新令牌服务器端?
    • 我是否应该将clientID和散列和盐渍刷新令牌存储在数据库中(以及实用程序字段,例如到期日期)?
  • 如果我的API用户具有单个clientID和secret,但同时执行多个调用(假设他们希望在多台计算机上扩展客户端以获得更好的吞吐量),那么预期的行为是什么?
    • 具体来说,我的意思是如果客户端的一个访问令牌过期,但他们的刷新令牌也已过期? 当然,他们可以同时到令牌端点获取新的访问令牌和刷新令牌,但那个clientID的其他实例呢?假设他们的代码是相同的(即他们不共享刷新令牌的知识),每个实例也将继续请求新的访问和刷新令牌。
    • 如果为clientID存储单个刷新令牌,则最终会过度请求刷新令牌,可能每次访问令牌到期时都是如此,这是不可取的。
    • 如果您为客户存储多个刷新令牌,那么有多少是合理的数字?

此外,撤销刷新令牌的常见过程是什么? 是否只是从存储它的地方删除它就这么简单?

感谢。

1 个答案:

答案 0 :(得分:1)

  

我是否应该将clientID和散列和盐渍刷新令牌存储在数据库中(以及实用程序字段,例如到期日期)?

我建议的方法是使用ASOS附加的票证标识符来创建它的所有令牌。您可以通过SerializeRefreshTokencontext.Ticket.GetTokenId()context.Ticket.ExpiresUtc事件中检索刷新令牌标识符和到期日期。

注意:默认标识符是GUID,但您可以使用context.Ticket.SetTokenId("token identifier")替换它。

  

具体来说,我的意思是如果客户端的一个访问令牌过期,但他们的刷新令牌也已过期?当然,他们可以同时到令牌端点获取新的访问令牌和刷新令牌,但那个clientID的其他实例呢?

这实际上取决于您的应用程序要求以及如何实现它。您可以自由地将刷新令牌视为完全独立,或者相反,相互依赖。这种逻辑通常会发生在HandleTokenRequest

  

此外,撤销刷新令牌的常见过程是什么?是否只是将其从您存储的地方删除它就简单了?

如果您使用默认令牌格式(超过推荐值),刷新令牌将被视为有效,直到它们过期。您可以通过进行数据库查找来检查令牌是否已从HandleTokenRequest撤消(您可以使用context.Ticket.GetTokenId()获取刷新令牌标识符)