我想为.net核心Web应用程序实施带有数字代码的电子邮件确认。 我利用了UserManager类中的GenerateEmailConfirmationTokenAsync,但它返回的是令牌而不是数字代码。我想我应该使用IUserTokenProvider接口创建一个自定义实现,但找不到任何示例。
如何使用IUserTokenProvider实现此功能?
答案 0 :(得分:3)
您使用该令牌生成操作回调网址
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var callbackUrl = Url.Action(
"ConfirmEmail", "Account",
new { userId = user.Id, code = code },
protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id,
"Confirm your account",
"Please confirm your account by clicking this link: <a href=\""
+ callbackUrl + "\">link</a>");
// ViewBag.Link = callbackUrl; // Used only for initial demo.
return View("DisplayEmail");
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);
}
答案 1 :(得分:0)
ASP.NET Core Identity中已有一个实现。
TotpSecurityStampBasedTokenProvider类(IUserTwoFactorTokenProvider接口的实现)会生成6位数字的令牌,这些令牌将过期。
TotpSecurityStampBasedTokenProvider
由EmailTokenProvider进一步继承,但是GenerateAsync方法是从TotpSecurityStampBasedTokenProvider
重用的(未被覆盖)。
这些类使用用户的安全标记来生成令牌,并提供自己的修饰符,但是实际的令牌生成是通过GenerateCode类中的Rfc6238AuthenticationService方法完成的。
因此,您可以使用现有的实现:
TotpSecurityStampBasedTokenProvider
EmailTokenProvider
(与上述相同)Rfc6238AuthenticationService
,如果您确实要自定义令牌