gpt4 book ai didi

angularjs - 确认电子邮件上的 ASP.NET Core Identity 无效 token

转载 作者:行者123 更新时间:2023-12-03 14:48:49 29 4
gpt4 key购买 nike

这是一个与此非常相似的问题
aspnet identity invalid token on confirmation email
但解决方案无效,因为我使用的是包含 ASP.NET Core Identity 的新 ASP.NET Core 1.0。

我的情况如下:

  • 在后端(ASP.NET Core),我有一个功能可以发送带有链接的密码重置电子邮件。为了生成该链接,我必须使用 Identity 生成代码。像这样的东西。
    public async Task SendPasswordResetEmailAsync(string email)
    {
    //_userManager is an instance of UserManager<User>
    var userEntity = await _userManager.FindByNameAsync(email);
    var tokenGenerated = await _userManager.GeneratePasswordResetTokenAsync(userEntity);
    var link = Url.Action("MyAction", "MyController", new { email = email, code = tokenGenerated }, protocol: HttpContext.Request.Scheme);
    //this is my service that sends an email to the user containing the generated password reset link
    await _emailService.SendPasswordResetEmailAsync(userEntity , link);
    }

    这将生成一封电子邮件,其中包含以下链接:
    http://myapp:8080/passwordreset?code=CfDJ8JBnWaVj6h1PtqlmlJaH57r9TRA5j7Ij1BVyeBUpqX+5Cq1msu9zgkuI32Iz9x/5uE1B9fKFp4tZFFy6lBTseDFTHSJxwtGu+jHX5cajptUBiVqIChiwoTODh7ei4+MOkX7rdNVBMhG4jOZWqqtZ5J30gXr/JmltbYxqOp4JLs8V05BeKDbbVO/Fsq5+jebokKkR5HEJU+mQ5MLvNURsJKRBbI3qIllj1RByXt9mufGRE3wmQf2fgKBkAL6VsNgB8w==
  • 然后,我的 AngularJs 应用程序将显示一个 View ,其中包含一个用于输入和确认新密码的表单,并将使用新密码和从 URL 中的查询参数获取的代码 PUT 一个 JSON 对象。
  • 最后,我的后端会收到 PUT 请求,抓取代码并使用 Identity 验证它,如下所示:
    [HttpPut]
    [AllowAnonymous]
    [Route("api/password/{email}")]
    public async Task<IActionResult> SendPasswordEmailResetRequestAsync(string email, [FromBody] PasswordReset passwordReset)
    {
    //some irrelevant validatoins here
    await _myIdentityWrapperService.ResetPasswordAsync(email, passwordReset.Password, passwordReset.Code);
    return Ok();
    }

  • 问题是 Identity 以

    Invalid token



    错误。我发现问题是代码不匹配,上面的代码将在 PUT 请求中的 JSON 对象中被接收,如下所示:

    CfDJ8JBnWaVj6h1PtqlmlJaH57r9TRA5j7Ij1BVyeBUpqX 5Cq1msu9zgkuI32Iz9x/5uE1B9fKFp4tZFFy6lBTseDFTHSJxwtGu jHX5cajptUBiVqIChiwoTODh7ei4 MOkX7rdNVBMhG4jOZWqqtZ5J30gXr/JmltbYxqOp4JLs8V05BeKDbbVO/Fsq5 jebokKkR5HEJU mQ5MLvNURsJKRBbI3qIllj1RByXt9mufGRE3wmQf2fgKBkAL6VsNgB8w==

    请注意,哪里有 +符号现在有空格 符号,显然这导致 Identity 认为 token 是不同的。
    出于某种原因,Angular 正在以不同的编码方式解码 URL 查询参数。

    如何解决这个问题?

    最佳答案

    这个答案https://stackoverflow.com/a/31297879/2948212为我指明了正确的方向。但正如我所说,它是针对不同版本的,现在它是略有不同的解决方案。

    答案还是一样:用base 64 url​​编码token,然后用base 64 url​​解码。这样 Angular 和 ASP.NET Core 将检索完全相同的代码。

    我需要为 Microsoft.AspNetCore.WebUtilities; 安装另一个依赖项

    现在代码将是这样的:

    public async Task SendPasswordResetEmailAsync(string email)
    {
    //_userManager is an instance of UserManager<User>
    var userEntity = await _userManager.FindByNameAsync(email);
    var tokenGenerated = await _userManager.GeneratePasswordResetTokenAsync(userEntity);
    byte[] tokenGeneratedBytes = Encoding.UTF8.GetBytes(tokenGenerated);
    var codeEncoded = WebEncoders.Base64UrlEncode(tokenGeneratedBytes);
    var link = Url.Action("MyAction", "MyController", new { email = email, code = codeEncoded }, protocol: HttpContext.Request.Scheme);
    //this is my service that sends an email to the user containing the generated password reset link
    await _emailService.SendPasswordResetEmailAsync(userEntity , link);
    }

    以及在 PUT 请求期间接收回代码时
    [HttpPut]
    [AllowAnonymous]
    [Route("api/password/{email}")]
    public async Task<IActionResult> SendPasswordEmailResetRequestAsync(string email, [FromBody] PasswordReset passwordReset)
    {
    //some irrelevant validatoins here
    await _myIdentityWrapperService.ResetPasswordAsync(email, passwordReset.Password, passwordReset.Code);
    return Ok();
    }

    //in MyIdentityWrapperService
    public async Task ResetPasswordAsync(string email, string password, string code)
    {
    var userEntity = await _userManager.FindByNameAsync(email);
    var codeDecodedBytes = WebEncoders.Base64UrlDecode(code);
    var codeDecoded = Encoding.UTF8.GetString(codeDecodedBytes);
    await _userManager.ResetPasswordAsync(userEntity, codeDecoded, password);
    }

    关于angularjs - 确认电子邮件上的 ASP.NET Core Identity 无效 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38781295/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com