public virtual ActionResult ForgotPassword(ForgotPasswordViewModel model) { if (ModelState.IsValid) { var user = _userService.GeneratePasswordResetToken(model.Email, Constants.DefaultPasswordResetTokenExpirationHours * 60); if (user != null) { var resetPasswordUrl = Url.ConfirmationUrl( MVC.Users.ResetPassword(), user.Username, user.PasswordResetToken, protocol: Request.Url.Scheme); _messageService.SendPasswordResetInstructions(user, resetPasswordUrl); TempData["Email"] = user.EmailAddress; return RedirectToAction(MVC.Users.PasswordSent()); } ModelState.AddModelError("Email", "Could not find anyone with that email."); } return View(model); }
public async Task ReturnsSameViewIfTokenGenerationFails() { GetMock<AuthenticationService>() .Setup(s => s.GeneratePasswordResetToken("user", 1440)) .CompletesWithNull(); var controller = GetController<UsersController>(); var model = new ForgotPasswordViewModel { Email = "user" }; var result = await controller.ForgotPassword(model) as ViewResult; Assert.NotNull(result); Assert.IsNotType(typeof(RedirectResult), result); }
public virtual async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model) { // We don't want Login to have us as a return URL // By having this value present in the dictionary BUT null, we don't put "returnUrl" on the Login link at all ViewData[Constants.ReturnUrlViewDataKey] = null; if (ModelState.IsValid) { var user = await AuthService.GeneratePasswordResetToken(model.Email, Constants.DefaultPasswordResetTokenExpirationHours * 60); if (user != null) { return SendPasswordResetEmail(user, forgotPassword: true); } ModelState.AddModelError("Email", "Could not find anyone with that email."); } return View(model); }
public async Task SendsEmailWithPasswordResetUrl() { const string resetUrl = "https://nuget.local/account/forgotpassword/somebody/confirmation"; var user = new User("somebody") { EmailAddress = "*****@*****.**", PasswordResetToken = "confirmation", PasswordResetTokenExpirationDate = DateTime.UtcNow.AddDays(1) }; GetMock<IMessageService>() .Setup(s => s.SendPasswordResetInstructions(user, resetUrl, true)); GetMock<IUserService>() .Setup(s => s.FindByEmailAddress("user")) .Returns(user); GetMock<AuthenticationService>() .Setup(s => s.GeneratePasswordResetToken("user", 1440)) .CompletesWith(user); var controller = GetController<UsersController>(); var model = new ForgotPasswordViewModel { Email = "user" }; await controller.ForgotPassword(model); GetMock<IMessageService>() .Verify(s => s.SendPasswordResetInstructions(user, resetUrl, true)); }
public async Task RedirectsAfterGeneratingToken() { var user = new User { EmailAddress = "*****@*****.**", Username = "******" }; GetMock<AuthenticationService>() .Setup(s => s.GeneratePasswordResetToken("user", 1440)) .CompletesWith(user) .Verifiable(); var controller = GetController<UsersController>(); var model = new ForgotPasswordViewModel { Email = "user" }; var result = await controller.ForgotPassword(model) as RedirectToRouteResult; Assert.NotNull(result); GetMock<AuthenticationService>() .Verify(s => s.GeneratePasswordResetToken("user", 1440)); }
public void SendsEmailWithPasswordResetUrl() { var user = new User { EmailAddress = "*****@*****.**", Username = "******", PasswordResetToken = "confirmation", PasswordResetTokenExpirationDate = DateTime.UtcNow.AddDays(1) }; var messageService = new Mock<IMessageService>(); string resetUrl = "https://example.org/?Controller=Users&Action=ResetPassword&username=somebody&token=confirmation"; messageService.Setup(s => s.SendPasswordResetInstructions(user, resetUrl) ); var userService = new Mock<IUserService>(); userService.Setup(s => s.GeneratePasswordResetToken("user", 1440)).Returns(user); var controller = CreateController(userSvc: userService, messageSvc: messageService); var model = new ForgotPasswordViewModel { Email = "user" }; var result = controller.ForgotPassword(model) as RedirectToRouteResult; Assert.NotNull(result); messageService.Verify(s => s.SendPasswordResetInstructions(user, resetUrl)); }
public void ReturnsSameViewIfTokenGenerationFails() { var userService = new Mock<IUserService>(); userService.Setup(s => s.GeneratePasswordResetToken("user", 1440)).Returns((User)null); var controller = CreateController(userSvc: userService); var model = new ForgotPasswordViewModel { Email = "user" }; var result = controller.ForgotPassword(model) as ViewResult; Assert.NotNull(result); Assert.IsNotType(typeof(RedirectResult), result); }
public void RedirectsAfterGeneratingToken() { var userService = new Mock<IUserService>(); var user = new User { EmailAddress = "*****@*****.**", Username = "******" }; userService.Setup(s => s.GeneratePasswordResetToken("user", 1440)).Returns(user).Verifiable(); var controller = CreateController(userSvc: userService); var model = new ForgotPasswordViewModel { Email = "user" }; var result = controller.ForgotPassword(model) as RedirectToRouteResult; Assert.NotNull(result); userService.Verify(s => s.GeneratePasswordResetToken("user", 1440)); }
public virtual ActionResult ForgotPassword(ForgotPasswordViewModel model) { // We don't want Login to have us as a return URL // By having this value present in the dictionary BUT null, we don't put "returnUrl" on the Login link at all ViewData[Constants.ReturnUrlViewDataKey] = null; if (ModelState.IsValid) { var user = UserService.GeneratePasswordResetToken(model.Email, Constants.DefaultPasswordResetTokenExpirationHours * 60); if (user != null) { var resetPasswordUrl = Url.ConfirmationUrl( MVC.Users.ResetPassword(), user.Username, user.PasswordResetToken, protocol: Request.Url.Scheme); MessageService.SendPasswordResetInstructions(user, resetPasswordUrl); TempData["Email"] = user.EmailAddress; return RedirectToAction(MVC.Users.PasswordSent()); } ModelState.AddModelError("Email", "Could not find anyone with that email."); } return View(model); }
public void SendsEmailWithPasswordResetUrl() { const string resetUrl = "https://nuget.local/account/ResetPassword/somebody/confirmation"; var user = new User { EmailAddress = "*****@*****.**", Username = "******", PasswordResetToken = "confirmation", PasswordResetTokenExpirationDate = DateTime.UtcNow.AddDays(1) }; var controller = GetController<UsersController>(); GetMock<IMessageService>() .Setup(s => s.SendPasswordResetInstructions(user, resetUrl)); GetMock<IUserService>() .Setup(s => s.FindByEmailAddress(It.IsAny<string>())) .Returns(user); GetMock<IUserService>() .Setup(s => s.GeneratePasswordResetToken("user", 1440)) .Returns(user); var model = new ForgotPasswordViewModel { Email = "user" }; controller.ForgotPassword(model); GetMock<IMessageService>() .Verify(s => s.SendPasswordResetInstructions(user, resetUrl)); }