Asp.net web api 刷新令牌-多个客户端的服务器端存储和撤销

Asp.net web api 刷新令牌-多个客户端的服务器端存储和撤销,asp.net-web-api,oauth,oauth-2.0,asp.net-core,aspnet-contrib,Asp.net Web Api,Oauth,Oauth 2.0,Asp.net Core,Aspnet Contrib,我开始使用ASOS(AspNet.Security.OpenIdConnect.Server)框架进行基于令牌的身份验证 我已经完成了访问令牌的生成和检索,现在转到刷新令牌位 我的问题是: 我应该如何在服务器端存储刷新令牌? 我应该只在数据库中存储clientID和经过哈希和盐析的刷新令牌(以及实用程序字段,如过期日期)吗 如果我的API的用户只有一个clientID和secret,但同时执行多个调用(例如,假设他们希望在多台机器上扩展客户端以获得更好的吞吐量),那么预期的行为是什么。

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

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

我的问题是:

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

谢谢

我应该只在数据库中存储clientID和经过哈希和盐析的刷新令牌(以及实用程序字段,如过期日期)吗

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

注意:默认标识符是GUID,但您可以使用
context.Ticket.SetTokenId(“令牌标识符”)
替换它

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

这实际上取决于您的应用程序需求以及您如何实现它。你可以自由地考虑刷新令牌是完全独立的,反之亦然,相互依存。此逻辑通常发生在
HandleTokenRequest

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


如果使用默认令牌格式(超过推荐值),则刷新令牌将被视为有效,直到其过期。您可以通过数据库查找(您可以使用
context.Ticket.GetTokenId()
)获取刷新令牌标识符)来检查令牌是否已从
HandleTokenRequest
中撤销。谢谢。我已经读过谷歌似乎只允许一个刷新令牌,所以我将选择只允许一个,并将管理应用程序中刷新令牌的共享作为消费者的任务。