使用 AspNetUserTokens 表在 ASP.NET Core Web Api 中存储刷新令牌

Posted

技术标签:

【中文标题】使用 AspNetUserTokens 表在 ASP.NET Core Web Api 中存储刷新令牌【英文标题】:Using AspNetUserTokens table to store refresh token in ASP.NET Core Web Api 【发布时间】:2019-05-08 14:42:48 【问题描述】:

我正在使用 ASP.NET Core Web API 应用程序。我正在尝试在 ASP.NET 身份(内置数据库表)之上实现基于 Jwt 令牌的身份验证。

我已经实现了注册用户、登录等所有场景,但现在尝试实现刷新令牌流(访问令牌过期,客户端需要使用刷新令牌获取替换的访问令牌)。我看到人们正在创建新表(refreshToken)来存储刷新令牌,以便可以使用访问令牌对其进行验证,并且将生成新的访问和刷新令牌

https://www.blinkingcaret.com/2018/05/30/refresh-tokens-in-asp-net-core-web-api/

https://www.c-sharpcorner.com/article/handle-refresh-token-using-asp-net-core-2-0-and-json-web-token/

我创建了新表(refreshToken)来存储刷新令牌并验证它以生成访问令牌,它工作正常,但我想看看我是否可以使用现有的 AspNetUserTokens 表来处理相同的场景。我了解 AspNetUserTokens 表用于确认电子邮件、忘记密码等。

我的问题是:如果有人使用 AspNetUserTokens 来存储 refreshtoken,请分享想法,因为 usermanager 类不公开直接令牌模型(AspNetUserTokens)并且不确定我是否使用 IdentityDbContext,什么是 pron和缺点?我已经实现了 IdentityDbContext 但我没有看到 Microsoft.AspNetCore.Identity 中的内置类将令牌存储在 AspNetUserTokens 中

非常感谢您的指导。

谢谢

【问题讨论】:

【参考方案1】:

我会直接回答您的问题,然后提出替代方案。您可以使用 AspNetUserTokens 表删除、设置、获取和验证令牌。但是,您可能可以跳过 db,我将在下面进行描述。

UserManager的以下方法会生成并存储:

await _userManager.RemoveAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
var newRefreshToken = await _userManager.GenerateUserTokenAsync(user, "MyApp", "RefreshToken");
await _userManager.SetAuthenticationTokenAsync(user, "MyApp", "RefreshToken", newRefreshToken);

UserManager 的以下方法将获取并验证:

var refreshToken = await _userManager.GetAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
var isValid = await _userManager.VerifyUserTokenAsync(user, "MyApp", "RefreshToken", refreshToken );

您将需要使用启动中的 IdentityBuilder 设置这样的提供程序。

identity.AddTokenProvider("MyApp", typeof(DataProtectorTokenProvider<User>)

作为将这些令牌存储在数据库中的替代方法,您可以根据需要使用以下方法使所有令牌无效。您可以在注销过程中执行此操作。

_userManager.UpdateSecurityStampAsync(user);

【讨论】:

这其中有一些诗意。作为一个DB人,我不知道到底是什么。 :) 为什么我们需要调用 RemoveAuthenticationTokenAsync? 您将如何删除与刷新令牌绑定在一起的访问令牌,或者您是否只有较低的访问令牌到期日期。我正在考虑扩展此表以跟踪链接到刷新令牌的访问令牌。 @lastlink 非常欢迎您这样做。身份可以灵活地满足您的任何需求...我认为这样做没有任何问题。 我想知道你如何从令牌中获取用户 ID? VerifyToken 方法期望接收用户对象,但当有人尝试交换刷新令牌以访问令牌时,您没有 UserId

以上是关于使用 AspNetUserTokens 表在 ASP.NET Core Web Api 中存储刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

外键约束,博客文章,acts_as_votable

双向链表在现实生活中的使用

为啥哈希表在存储桶的数组上使用链表?

为啥嵌套表在父表之外呈现?

sql语句中的group by要怎么用!!

如何根据database2中的表在database1中创建视图