Asp.net core Asp.net核心身份更改用户名/电子邮件
带有确认逻辑的默认身份更改用户名/电子邮件没有意义Asp.net core Asp.net核心身份更改用户名/电子邮件,asp.net-core,asp.net-identity,Asp.net Core,Asp.net Identity,带有确认逻辑的默认身份更改用户名/电子邮件没有意义 将应用程序设置为需要电子邮件确认 设置需要确认的电子邮件才能登录 然后用户更改电子邮件,错误地输入电子邮件,注销 现在用户已被锁定。电子邮件已更改,但需要 确认登录并且没有电子邮件确认链接,因为 地址输入不正确 我是否设置了错误的应用程序,或者Microsoft没有很好地设计Identity public async Task<IActionResult> OnPostAsync() {
- 将应用程序设置为需要电子邮件确认
- 设置需要确认的电子邮件才能登录
- 然后用户更改电子邮件,错误地输入电子邮件,注销
- 现在用户已被锁定。电子邮件已更改,但需要 确认登录并且没有电子邮件确认链接,因为 地址输入不正确
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
var user = await _userManager.GetUserAsync(User);
if (user == null)
{
return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
}
//...
var email = await _userManager.GetEmailAsync(user);
if (Input.Email != email)
{
var setEmailResult = await _userManager.SetEmailAsync(user, Input.Email);
if (!setEmailResult.Succeeded)
{
var userId = await _userManager.GetUserIdAsync(user);
throw new InvalidOperationException($"Unexpected error occurred setting email for user with ID '{userId}'.");
}
StatusMessage = "<strong>Verify your new email</strong><br/><br/>" +
"We sent an email to " + Input.Email +
" to verify your address. Please click the link in that email to continue.";
}
//...
await _signInManager.RefreshSignInAsync(user);
return RedirectToPage();
}
公共异步任务OnPostAsync()
{
如果(!ModelState.IsValid)
{
返回页();
}
var user=await\u userManager.GetUserAsync(用户);
if(user==null)
{
返回NotFound($“无法加载ID为“{{u userManager.GetUserId(user)}”的用户”);
}
//...
var email=await\u userManager.GetEmailAsync(用户);
如果(Input.Email!=电子邮件)
{
var setEmailResult=await_userManager.SetEmailAsync(user,Input.Email);
如果(!setEmailResult.successed)
{
var userId=wait_userManager.GetUserIdAsync(用户);
抛出新的InvalidOperationException($“为ID为“{userId}”的用户设置电子邮件时发生意外错误”);
}
StatusMessage=“验证您的新电子邮件”+ “我们向“+Input.email”发送了一封电子邮件+ “验证您的地址。请单击该电子邮件中的链接继续。”; } //... 等待(u signInManager.RefreshSignInAsync)(用户);; 返回重定向Topage(); }
您的问题正在为此目的使用
SetEmailAsync
。该方法旨在为当前不存在的用户设置电子邮件。在这种情况下,将confirm设置为false是有意义的,不会引起任何问题
还有另一种方法,changemailasync
,这是您应该使用的方法。此方法需要从电子邮件确认流获得的令牌。换句话说,您应该采取的步骤是:
changemailasync
changemailasync
就是为了这个目的而存在的。只需按照我上面概述的步骤,在这里更改用户通过管理页面提交新电子邮件地址时的逻辑
编辑#2
我已经为此提出了诉讼。我现在不能在这上面花更多的时间,但是如果我有时间,并且没有人比我更努力的话,我会尝试提交一个修复请求。解决方法相对简单
编辑#3
我能够得到一个基本的电子邮件更改流在一个分叉工作。然而,团队已经分配了这个问题,并且似乎将其作为更大的身份用户界面大修的一部分。我现在可能不会花更多的时间来讨论这个问题,但我鼓励您关注这个问题,以获得团队的更新。如果您碰巧借用了我的代码来实现修复,请注意,我正试图创建一个与其他代码相比熵最小的解决方案。例如,在实际的生产应用程序中,您应该将新电子邮件保存在数据库中的某个位置,而不是在URL中传递 如前所述,模板肯定提供了错误的行为。您可以在repo中看到模板的来源 我建议在GitHub项目上提出一个问题,这样就可以改变这种情况。当模板更新时,它们无疑必须考虑启用确认和未启用确认的情况。在您的情况下,可以相对轻松地重用
onPostSendVerificationMailAsync()
中已经存在的逻辑
更一般的实现如下所示:
public分部类索引模型:PageModel
{
//作为IOptions注入构造函数
私有只读标识选项_选项;
//从OnPostSendVerificationMailAsync()中提取
专用异步任务SendConfirmationMail(IdentityUser用户,字符串电子邮件)
{
var userId=wait_userManager.GetUserIdAsync(用户);
var code=wait_userManager.GenerateEmailConfirmationTokenAsync(用户);
var callbackUrl=Url.Page(
“/Account/ConfirmEmail”,
pageHandler:null,
值:new{userId=userId,code=code},
协议:请求。方案);
等待\u emailSender.SendEmailAsync(
电子邮件,
“确认您的电子邮件”,
$“请确认您的帐户。”);
}
公共异步任务OnPostAsync()
{
//…现有代码
var email=await\u userManager.GetEmailAsync(用户);
var ConfirmationMailSent=false;
如果(Input.Email!=电子邮件)
{
如果(_options.SignIn.require确认邮件)
{
//新实施
等待发送确认邮件(用户,输入.Email);
确认邮件发送=真;
}