【发布时间】:2016-12-11 09:36:52
【问题描述】:
这是一个与此非常相似的问题 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 应用程序将显示一个带有表单的视图,用于输入和确认新密码,并将使用新密码和从 URL 中的查询参数获取的代码放入一个 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 以一个
响应令牌无效
错误。我发现问题是代码不匹配,上面的代码将在 PUT 请求中的 JSON 对象中收到,如下所示:
CfDJ8JBnWaVj6h1PtqlmlJaH57r9TRA5j7Ij1BVyeBUpqX 5Cq1msu9zgkuI32Iz9x/5uE1B9fKFp4tZFFy6lBTseDFTHSJxwtGu jHX5cajptUBiVqIChiwoTODh7ei4 MOkX7rdNVBMhG4jOZWqqtZ5J30gXr/JmltbYxqOp4JLs8V05BeKDbbVO/Fsq5 jebokKkR5HEJU mQ5MLvNURsJKRBbI3qIllj1RByXt9mufGRE3wmQf2fgKBkAL6VsNgB8w==
请注意,有 + 符号的地方现在有空格 符号,显然这会导致 Identity 认为令牌不同。
由于某种原因,Angular 以与编码不同的方式解码 URL 查询参数。
如何解决?
【问题讨论】:
-
在我的情况下(Asp.Net Core 3.0),脚手架页面似乎引入了这个错误。请在此处查看我的answer。
标签: angularjs asp.net-core asp.net-identity forgot-password