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

36

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

我已经实现了所有的场景,比如注册用户、登录等,但是现在正在尝试实现刷新令牌流程(当访问令牌过期时,客户端需要使用刷新令牌来获取替换后的访问令牌)。我看到有人创建新的表(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类不直接暴露token模型(AspNetUserTokens),而且我不确定如果我使用IdentityDbContext,它的优缺点是什么? 我已经实现了IdentityDbContext,但我没有看到Microsoft.AspNetCore.Identity中内置的类可以在AspNetUserTokens中存储token。

非常感谢您提供一些指导。

谢谢

1个回答

45

我将直接回答你的问题,然后提出一种替代方案。您可以使用AspNetUserTokens表来删除、设置、获取和验证令牌。但是,您可能可以跳过数据库,我将在下面描述这个过程。

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 );
您需要使用Startup中的IdentityBuilder设置此类提供程序。
identity.AddTokenProvider("MyApp", typeof(DataProtectorTokenProvider<User>)

作为将这些 token 存储在数据库之外的一种替代方案,您可以使用以下内容根据需要使所有 token 失效。您可能会将此作为注销的一部分来执行。

_userManager.UpdateSecurityStampAsync(user);

2
这里有一些诗意。作为一个数据库专家,我不太确定是什么。 :) - Metaphor
2
为什么我们需要调用RemoveAuthenticationTokenAsync? - Der_Meister
1
你会如何移除与刷新令牌绑定在一起的访问令牌,或者你只是将访问令牌过期时间设置得很短。我正在考虑扩展这个表格以跟踪与刷新令牌相关联的访问令牌。 - lastlink
1
@lastlink,您非常欢迎这样做。身份验证是灵活的,可以满足您的任何需求...我认为这样做没有任何问题。 - Mosia Thabo
1
@BogdanMart 在尝试交换刷新令牌之前,您应该拥有一个过期的访问令牌。我建议将用户ID添加到访问令牌中的声明中,这样即使它已过期,您也应该能够从那里获取您的用户ID。您应该将用户ID放在“sub”声明中。 - Urielzen
显示剩余8条评论

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