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

Ank*_*tel 13 security authentication jwt asp.net-core-identity asp.net-core-2.1

我正在使用ASP.NET Core Web API应用程序.我正在尝试在ASP.NET Identity(内置数据库表)之上实现基于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,有什么代词和缺点?我已经实现了IdentityDbContext,但是我没有在Microsoft.AspNetCore.Identity中看到内置类来在AspNetUserTokens中存储令牌

非常感谢一些指导.

谢谢

Chr*_*oon 14

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

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

await _userManager.RemoveAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
var newRefreshToken = await _userManager.GenerateUserTokenAsync(user, "MyApp", "RefreshToken");
await _userManager.SetAuthenticationTokenAsync(user, "MyApp", "RefreshToken", newRefreshToken);
Run Code Online (Sandbox Code Playgroud)

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

var refreshToken = await _userManager.GetAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
var isValid = await _userManager.VerifyUserTokenAsync(user, "MyApp", "RefreshToken", refreshToken );
Run Code Online (Sandbox Code Playgroud)

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

identity.AddTokenProvider("MyApp", typeof(DataProtectorTokenProvider<User>)
Run Code Online (Sandbox Code Playgroud)

作为将这些令牌存储在数据库中的替代方法,您可以根据需要使用以下命令使所有令牌无效。您可以将其作为注销的一部分。

_userManager.UpdateSecurityStampAsync(user);
Run Code Online (Sandbox Code Playgroud)

  • 这有点诗意。作为一名数据库专家,我不知道到底是什么。:) (2认同)
  • 为什么我们需要调用RemoveAuthenticationTokenAsync? (2认同)