Asp.Net Core Identity: GenerateChangePhoneNumberT



在使用UserManager创建用户后,使用GenerateChangePhoneNumberTokenAsync()生成电话号码令牌。我一直看到GenerateChangePhoneNumberTokenAsync()没有在AspNetUserTokens表中创建记录,即使生成了令牌。电话验证失败。

我也打电话给GenerateEmailConfirmationTokenAsync()核实邮件。但是电子邮件验证是成功的,即使在AspNetUserTokens表中没有记录。有人能阐明为什么GenerateChangePhoneNumberTokenAsync不持久化AspNetUserTokens吗记录呢?

平台:.Net 5

代码片段如下:

using (var scope = TransactionUtil.CreateAsyncTransactionScope())
{
var result = await _userManager.CreateAsync(user, createUserDto.Password).ConfigureAwait(false);
if (!result.Succeeded)
{
throw new Exception("Unable to create account");
}
// Business logic removed for clarity
scope.Complete();
}
await SendConfirmEmailAsync(user);
await SendPhoneNumberTokenAsync(user);

private async Task SendConfirmEmailAsync(ApplicationUser user)
{
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
// Send EMail
}
private async Task SendPhoneNumberTokenAsync(ApplicationUser user)
{
if(user == null || string.IsNullOrEmpty(user.PhoneNumber) || user.PhoneNumberConfirmed)
return;
var token = await _userManager.GenerateChangePhoneNumberTokenAsync(user, user.PhoneNumber);
// Send SMS
}

我想我们可能有一点误解…

GenerateChangePhoneNumberTokenAsyncGenerateEmailConfirmationTokenAsync都不会将任何东西存储到数据库中。

正如我们在这里看到的,userManager.GenerateChangePhoneNumberTokenAsync将调用GenerateUserTokenAsync的代码实现,这是GenerateChangePhoneNumberTokenAsync将调用的相同方法(只是参数不同)。

GenerateUserTokenAsync然后调用GenerateAsync方法,PhoneNumberTokenProviderEmailTokenProvider只是简单地从基类TotpSecurityStampBasedTokenProvider中获取,再次,不存储任何东西到数据库,如果有任何疑问,我们可以在这里检查manager.CreateSecurityTokenAsync方法。

上面提到的AspNetUserTokens令牌(我相信是在EF上实现的)被设计用来存储关于外部认证令牌存储的信息,这里已经回答了。

相关内容

  • 没有找到相关文章

最新更新