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

Security 使用AspNetUserTokens表在ASP.NET核心Web Api中存储刷新令牌,security,authentication,jwt,asp.net-core-2.1,asp.net-core-identity,Security,Authentication,Jwt,Asp.net Core 2.1,Asp.net Core Identity,我正在使用ASP.NET核心Web API应用程序。我正在尝试在ASP.NET标识(内置于数据库表)之上实现基于Jwt令牌的身份验证 我已经实现了所有场景,如注册用户、登录等,但现在尝试实现刷新令牌流(当访问令牌过期时,客户端需要使用刷新令牌替换访问令牌)。我已经看到人们正在创建新表(refreshToken)来存储刷新令牌,以便可以使用访问令牌对其进行验证,并将生成新的访问和刷新令牌 我已经创建了一个新表(refreshToken)来存储刷新令牌并验证它以生成访问令牌,它工作正常,但我想看

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

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

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

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

非常感谢您的指导


谢谢

我会直接回答你的问题,然后提出一个替代方案。您可以使用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>)

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