2017-01-18 4 views
0

Я просто добавлю часть «забыли пароль» MVC 5 в свой проект, и я не могу изменить свой пароль после получения электронной почты.Ошибка сброса токена ASP.NET

Ошибка: В App =>Image of error in the app

В Visual Studio =>Image of error visual studio

Код, в котором ошибка происходят из:

public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 
     var user = await UserManager.FindByEmailAsync(model.Email); 
     if (user == null) 
     { 
      // Don't reveal that the user does not exist 
      return RedirectToAction("ResetPasswordConfirmation", "Account"); 
     } 
     var code = model.Code.Replace(" ","+"); 
     **var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);** 
     if (result.Succeeded) 
     { 
      return RedirectToAction("ResetPasswordConfirmation", "Account"); 
     } 
     AddErrors(result); 
     return View(); 
    } 

Я пытался много вещей, найти на StackOverflow и другой, но это не сработало.

Если вы получили какие-либо идеи, почему я получил эту ошибку :)

я использую базовый шаблон, предложенный в создании веб-приложений ASP.NET в Visual Studio. Я могу загрузить все файлы кода, которые вы хотите, просто спросите, что вам нужно, чтобы помочь мне, и я загружу его в течение 2 минут!

Благодаря

+0

Это поможет, если вы хотя бы включили ошибку, которую видите, вместе с любым соответствующим кодом из области, которая создает ошибку. –

+0

Я отредактировал исходное сообщение, чтобы показать вам ошибку, которую я получаю @JamesThorpe –

ответ

0

Я понял, в чем была проблема,

Мои CallBackURL имели формат с символическими специальных символов и верхнийРЕГИСТР

Первый в ForgotPasswordViewModel, я генерироваться мой URL вручную, то я закодировать это правильно

  string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
      code = System.Web.HttpUtility.UrlEncode(code); 
      string datcode = code; 
      //var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 
      var datUrl = "http://localhost:62989/Account/Resetpassword?" + user.Id + "&Code=" + code; 

Для проблемы с upperCase я забыл метод ToTitleCase при назначении callbackurl моему сообщению emai, поэтому я удалил его.

  message = message.Replace("@ViewBag.Name", CultureInfo.CurrentCulture.TextInfo.ToTitleCase(usernom)); 
      message = message.Replace("@ViewBag.CallBackUrl", datUrl); 
      await MessageServices.SendEmailAsync(model.Email, emailSubject, message); 

Во-вторых, я ResetPasswordViewModel, я декодировать маркер с

var code = WebUtility.UrlDecode(model.Code); 

И заменить пустое пространство на оригинал +,

code = code.Replace(' ', '+'); 

Наконец он работает большой в функции ResetPasswordAsync !

var result = await UserManager.ResetPasswordAsync(user.Id, code, model.Password); 

Спасибо @Ravi за помощь

0

Предполагая, что вы используете шаблон по умолчанию вы можете использовать ниже код для генерации CallBackURL

string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 

Вы должны URL-адрес закодировать code (маркер) перед его отправкой по электронной почте т.е. изменить его code = HttpUtility.UrlEncode(code)

Вам не нужно этой линии var code = model.Code.Replace(" ","+");

Hop Это помогает.

+0

Я попробовал вам решение, добавив «code = HttpUtility.UrlEncode (code);» но я продолжаю получать недопустимое сообщение об ошибке токена:/ –

+0

Перед отправкой электронной почты проверьте значение «code» и посмотрите, получаете ли вы тот же «код». Из-за кодирования иногда значение слегка меняется для специальных символов, таких как + =. –

+1

Я понял, что проблема hte с «+» в удаляемой строке пустым пространством, а мой верхний регистр заменяется на нижний регистр, спасибо за помощь @Ravi :) –

1

Моим вопроса было очень похож, но это случилось с моим двигателем маршрутизации преобразования все URL-адресов в нижнем регистр (для SEO, и т.д.). Мне нужно было убедиться, что параметры строки запроса допускают смешанный случай. Base64 использует смешанный регистр.

Я добавил атрибут NoLowercaseQueryString к каждому из методов моего контроллера. Это относится к MVC Boilerplate project.

Смежные вопросы