AspNet.Security.OpenIdConnect.Server. 刷新令牌

4
据我所知,ASOS原生支持刷新令牌。为了获取刷新令牌,我需要在令牌请求中添加offline_access范围。但是它们存储在哪里?如何更改令牌的过期日期或删除令牌?如何确定刷新令牌是为哪个用户创建的?
1个回答

5

但它们存储在哪里?

默认情况下,它们不存储在任何地方:它们是自包含的。只要用于保护刷新令牌的加密密钥仍然在ASP.NET数据保护密钥环中,它们就可以被ASOS解密并用于发出新的访问令牌。


如何更改令牌的过期日期?

可以使用选项全局设置默认的过期日期,使用RefreshTokenLifetime属性。如果您没有提供自己的生命周期,则它们有效期为14天。

请注意,默认情况下启用滑动过期,这意味着每次进行新的grant_type=refresh_token请求时,您都会获得一个新的刷新令牌(有效期为14天)。您可以通过将UseSlidingExpiration设置为false来禁用滑动到期。


...或者删除它?

由于刷新令牌是自包含的,因此您无法删除它们。当然,您可以考虑使用自定义令牌(例如对应于数据库条目的唯一字符串),方法是重写SerializeRefreshTokenDeserializeRefreshToken事件,但推荐的方法是在接收到刷新令牌请求时将它们视为无效。

为此,您可以重写HandleTokenRequest事件,并在认为refresh_token已被吊销且无法用于发出新令牌时调用context.Reject()


如何确定刷新令牌是为哪个用户创建的?

刷新令牌包含您创建原始身份验证票证时添加的所有声明,因此,如果您添加了与用户标识符对应的sub声明,则可以使用它从数据库中检索用户配置文件。


谢谢。但是我们对令牌过期存在一个误解。我该如何更改一个具体已生成令牌的过期日期?或者我应该使用 GrantRefreshTokenGrant 方法将其作废?如果您能向我展示禁止用户的方法,我将非常高兴。manager.SupportsUserSecurityStamp 是什么?我该如何使用它?实际上,我需要为用户生成令牌,并立即使令牌失效(立即禁止用户)。 - Stalso
你无法更改已经发行的刷新令牌的过期日期(它在令牌内部被硬编码),但是正如你所发现的,你可以使用 GrantRefreshTokenGrant 来添加自己的逻辑来确定刷新令牌是否仍然有效。如果用户被禁止,你可以调用 context.Rejected() 来拒绝刷新令牌请求。 - Kévin Chalet
据我所知,我需要在我的用户模型中添加“禁止”字段,并在“GrantRefreshTokenGrant”中进行检查,然后拒绝令牌?如果我使用这种方法,我将无法立即禁止用户或添加新的声明。有没有办法为每个请求检查访问令牌?也许我应该在“AuthorizationEndpoint”中执行此操作? - Stalso
抱歉,我无法弄清楚如何在 app.UseJwtBearerAuthentication() 中实现它。你能告诉我在哪里做吗? - Stalso
谢谢。这非常有用。 - Stalso
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接