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

标签 asp.net-core asp.net-identity

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

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

  • 我是否设置了我的应用程序错误或 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();
        }
    

    最佳答案

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

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

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

  • 编辑

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

    编辑#2

    我已经提交了 issue on Github为了这。我现在不能再花时间在这上面了,但是如果我有时间并且没有其他人能比我做得更好,我会尝试提交一个修复请求。修复相对简单。

    编辑#3

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

    关于asp.net-core - Asp.net 核心身份更改用户名/电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54128505/

    相关文章:

    azure - 如何使用 Github Actions 将具有多个 Web 应用程序的 .NET Core 解决方案部署到 Azure

    c# - .NET CORE 2.1- 如何返回不属于 DefaultChallengeScheme 的挑战

    c# - 为什么安全印章不会注销用户?

    c# - ASP.NET 身份用户存储 : Why return Task?

    c# - 在 asp.net core : Circular dependency problem 的 dbcontext 中播种用户和角色

    asp.net - 如何在 ASP.NET Identity 2.0 alpha 1 中使用电子邮件登录?

    git - ASP.NET 5 Beta 7 - GIT 部署中缺少 Microsoft.Dnx.Host.Clr

    linux - 有没有办法检查和清理在 Linux 下运行的 ASP.NET Core 应用程序的证书吊销列表缓存?

    c# - Blazor 无法连接到 ASP.NET Core WebApi (CORS)

    razor - 从 ASP.net Core 2 中的 View 访问自定义 ApplicationUser 属性