Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core Asp.net核心身份更改用户名/电子邮件_Asp.net Core_Asp.net Identity - Fatal编程技术网

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() {

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

  • 将应用程序设置为需要电子邮件确认
  • 设置需要确认的电子邮件才能登录
  • 然后用户更改电子邮件,错误地输入电子邮件,注销
  • 现在用户已被锁定。电子邮件已更改,但需要 确认登录并且没有电子邮件确认链接,因为 地址输入不正确
我是否设置了错误的应用程序,或者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();
    }
公共异步任务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
  • 用户的电子邮件现在已更改并确认
  • 编辑

    FWIW,是的,这似乎是默认模板的问题。我不知道他们为什么这样做,因为是的,这会破坏很多东西,正如我在回答中所说,
    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);
    确认邮件发送=真;
    }