Asp.net 核心身份更改用户名/电子邮件

pet*_*ete 4 asp.net-identity asp.net-core

带有确认逻辑的默认身份更改用户名/电子邮件没有意义。

  • 设置需要电子邮件确认的应用程序。
  • 设置需要确认的电子邮件才能登录。
  • 然后用户更改电子邮件、错误输入电子邮件、注销。
  • 现在用户被锁定。电子邮件已更改,但需要确认才能登录且没有电子邮件确认链接,因为地址输入不正确。

我的应用程序设置错误还是 Microsoft 没有很好地设计 Identity?

  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();
    }
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 8

您的问题正在SetEmailAsync用于此目的。该方法旨在为当前不存在的用户设置电子邮件。在这种情况下,将确认设置为 false 是有意义的并且不会导致任何问题。

还有另一种方法,ChangeEmailAsync,这是您应该使用的方法。此方法需要一个令牌,该令牌将从电子邮件确认流程中获得。换句话说,您应该执行的步骤是:

  1. 用户提交带有新电子邮件的表单以更改为
  2. 您向用户发送确认电子邮件。用户要更改的电子邮件地址需要保留在确认链接中或数据库中的单独位置。换句话说,用户在其用户记录中的实际电子邮件并没有改变
  3. 用户单击电子邮件中的确认链接。您可以从链接或您之前保留的任何位置获得他们想要更改的新电子邮件地址
  4. ChangeEmailAsync使用此电子邮件和来自确认链接的令牌进行呼叫。
  5. 用户的电子邮件现已更改并确认。

编辑

FWIW,是的,这似乎是默认模板的问题。不知道他们为什么这样做,因为是的,它非常破坏事情,就像我在回答中所说的那样,ChangeEmailAsync正是为此目的而存在的。只需按照我上面概述的步骤并在此处更改用户通过“管理”页面提交新电子邮件地址时发生的情况的逻辑。

编辑#2

我已经为此在 Github 上提交了一个问题。我现在不能再投入更多时间,但是如果我有时间并且没有其他人打败我,我会尝试提交修复请求。修复相对简单。

编辑 #3

我能够在 fork 中获得基本的电子邮件更改流程。但是,该团队已经分配了该问题,并且似乎将其作为对身份 UI 进行大修的一部分。我现在可能不会再花更多时间在这上面,但鼓励您关注该问题以获取团队的更新。如果您现在碰巧借用我的代码来实现修复,请注意我试图创建一个对其他代码具有最小熵的解决方案。例如,在真正的生产应用程序中,您应该将新电子邮件保存在数据库中的某个位置,而不是在 URL 中传递它。