Files
marechai/Marechai/Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

85 lines
2.6 KiB
C#

using System.ComponentModel.DataAnnotations;
using System.Text;
using System.Threading.Tasks;
using Marechai.Database.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.WebUtilities;
namespace Marechai.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class ResetPasswordModel : PageModel
{
readonly UserManager<ApplicationUser> _userManager;
public ResetPasswordModel(UserManager<ApplicationUser> userManager) => _userManager = userManager;
[BindProperty]
public InputModel Input { get; set; }
public IActionResult OnGet(string code = null)
{
if(code == null)
{
return BadRequest("A code must be supplied for password reset.");
}
Input = new InputModel
{
Code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code))
};
return Page();
}
public async Task<IActionResult> OnPostAsync()
{
if(!ModelState.IsValid)
{
return Page();
}
ApplicationUser user = await _userManager.FindByEmailAsync(Input.Email);
if(user == null)
{
// Don't reveal that the user does not exist
return RedirectToPage("./ResetPasswordConfirmation");
}
IdentityResult result = await _userManager.ResetPasswordAsync(user, Input.Code, Input.Password);
if(result.Succeeded)
{
return RedirectToPage("./ResetPasswordConfirmation");
}
foreach(IdentityError error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
return Page();
}
public class InputModel
{
[Required, EmailAddress]
public string Email { get; set; }
[Required,
StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.",
MinimumLength = 6), DataType(DataType.Password)]
public string Password { get; set; }
[DataType(DataType.Password), Display(Name = "Confirm password"),
Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
public string Code { get; set; }
}
}
}