using System; using System.Web.Mvc; using System.Web.Security; using MileageTraker.Web.ViewModels.Account; namespace MileageTraker.Web.Controllers { [Authorize] public class AccountController : ControllerBase { [AllowAnonymous] public ActionResult Login(string returnUrl) { ViewBag.ReturnUrl = returnUrl; return View(); } [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { var success = Membership.ValidateUser(model.Username, model.Password); if (success) { FormsAuthentication.SetAuthCookie(model.Username, model.RememberMe); // TODO: send notification to user return RedirectToLocal(returnUrl); } } // If we got this far, something failed, redisplay form ModelState.AddModelError("", "The user name or password provided is incorrect."); return View(model); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult LogOff() { FormsAuthentication.SignOut(); // TODO: send notification to user return RedirectToAction("Index", "CreateLog"); } //[AllowAnonymous] //public ActionResult Register() //{ // return View(); //} //[HttpPost] //[AllowAnonymous] //[ValidateAntiForgeryToken] //public ActionResult Register(RegisterModel model) //{ // if (ModelState.IsValid) // { // // Attempt to register the user // try // { // WebSecurity.CreateUserAndAccount(model.UserName, model.Password); // WebSecurity.Login(model.UserName, model.Password); // return RedirectToAction("Login"); // } // catch (MembershipCreateUserException e) // { // ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); // } // } // // If we got this far, something failed, redisplay form // return View(model); //} public ActionResult Manage(ManageMessageId? message) { ViewBag.StatusMessage = message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed." : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set." : ""; ViewBag.ReturnUrl = Url.Action("Manage"); return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Manage(ChangePasswordViewModel model) { ViewBag.ReturnUrl = Url.Action("Manage"); if (ModelState.IsValid) { // ChangePassword will throw an exception rather than return false in certain failure scenarios. bool changePasswordSucceeded; try { var currentUser = Membership.GetUser(User.Identity.Name, true); changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword); } catch (Exception) { changePasswordSucceeded = false; } if (changePasswordSucceeded) { return RedirectToAction("Manage", new { Message = ManageMessageId.ChangePasswordSuccess }); } ModelState.AddModelError("", "The current password is incorrect or the new password is invalid."); } // If we got this far, something failed, redisplay form return View(model); } private ActionResult RedirectToLocal(string returnUrl) { if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } return RedirectToAction("Index", "Log"); } public enum ManageMessageId { ChangePasswordSuccess, SetPasswordSuccess, } private static string ErrorCodeToString(MembershipCreateStatus createStatus) { // See http://go.microsoft.com/fwlink/?LinkID=177550 for // a full list of status codes. switch (createStatus) { case MembershipCreateStatus.DuplicateUserName: return "User name already exists. Please enter a different user name."; case MembershipCreateStatus.DuplicateEmail: return "A user name for that e-mail address already exists. Please enter a different e-mail address."; case MembershipCreateStatus.InvalidPassword: return "The password provided is invalid. Please enter a valid password value."; case MembershipCreateStatus.InvalidEmail: return "The e-mail address provided is invalid. Please check the value and try again."; case MembershipCreateStatus.InvalidAnswer: return "The password retrieval answer provided is invalid. Please check the value and try again."; case MembershipCreateStatus.InvalidQuestion: return "The password retrieval question provided is invalid. Please check the value and try again."; case MembershipCreateStatus.InvalidUserName: return "The user name provided is invalid. Please check the value and try again."; case MembershipCreateStatus.ProviderError: return "The authentication provider returned an error. Please verify your entry and try again. If the problem persists, please contact your system administrator."; case MembershipCreateStatus.UserRejected: return "The user creation request has been canceled. Please verify your entry and try again. If the problem persists, please contact your system administrator."; default: return "An unknown error occurred. Please verify your entry and try again. If the problem persists, please contact your system administrator."; } } } }