4

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

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

我的问题是:

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

另外,撤销刷新令牌的常见过程是什么?就像从存储它的任何地方删除它一样简单吗?

谢谢。

4

1 回答 1

2

我是否应该将 clientID 以及经过哈希处理和加盐的刷新令牌存储在数据库中(以及实用程序字段,例如到期日期)?

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

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

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

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

另外,撤销刷新令牌的常见过程是什么?就像从存储它的任何地方删除它一样简单吗?

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

于 2016-08-07T17:22:34.483 回答