Это очень похожий вопрос на этот вопрос Недействительный токен идентификации aspnet в электронной почте подтверждения но решения недействительны, потому что я использую новый ASP.NET Core 1.0, который включает в себя идентификатор ядра ASP.NET.
Мой сценарий выглядит следующим образом:
-
В конце (ядро ASP.NET) у меня есть функция, которая отправляет пароль reset по ссылке. Чтобы сгенерировать эту ссылку, мне нужно сгенерировать код с помощью 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 представило бы представление с формой для ввода и подтверждения нового пароля и поместило бы объект JSON с новым паролем и кодом, полученным из параметра запроса в URL.
-
Наконец, мой задний конец получит запрос 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 отвечает
Недопустимый токен
ошибка. Я обнаружил, что проблема в том, что коды не совпадают, и вышеуказанный код будет получен обратно в объекте JSON в запросе PUT следующим образом:
CfDJ8JBnWaVj6h1PtqlmlJaH57r9TRA5j7Ij1BVyeBUpqX 5Cq1msu9zgkuI32Iz9x/5uE1B9fKFp4tZFFy6lBTseDFTHSJxwtGu jHX5cajptUBiVqIChiwoTODh7ei4 MOkX7rdNVBMhG4jOZWqqtZ5J30gXr/JmltbYxqOp4JLs8V05BeKDbbVO/Fsq5 jebokKkR5HEJU mQ5MLvNURsJKRBbI3qIllj1RByXt9mufGRE3wmQf2fgKBkAL6VsNgB8w==
Обратите внимание, что там, где есть +
символы, теперь есть пробелы , и, очевидно, это заставляет Identity думать, что токены разные.
По какой-то причине Angular декодирует параметр запроса URL по-другому, который был закодирован.
Как разрешить это?