99 lines
3.9 KiB
Plaintext
99 lines
3.9 KiB
Plaintext
@page "/Account/ResetPassword"
|
|
|
|
@using System.ComponentModel.DataAnnotations
|
|
@using System.Text
|
|
@using Microsoft.AspNetCore.Identity
|
|
@using Microsoft.AspNetCore.WebUtilities
|
|
@using BlazorApp1.Data
|
|
|
|
@inject IdentityRedirectManager RedirectManager
|
|
@inject UserManager<ApplicationUser> UserManager
|
|
|
|
<PageTitle>Reset password</PageTitle>
|
|
|
|
<h1>Reset password</h1>
|
|
<h2>Reset your password.</h2>
|
|
<hr/>
|
|
<div class="row">
|
|
<div class="col-md-4">
|
|
<StatusMessage Message="@Message"/>
|
|
<EditForm Model="Input" FormName="reset-password" OnValidSubmit="OnValidSubmitAsync" method="post">
|
|
<DataAnnotationsValidator/>
|
|
<ValidationSummary class="text-danger" role="alert"/>
|
|
|
|
<input type="hidden" name="Input.Code" value="@Input.Code"/>
|
|
<div class="form-floating mb-3">
|
|
<InputText @bind-Value="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="name@example.com"/>
|
|
<label for="email" class="form-label">Email</label>
|
|
<ValidationMessage For="() => Input.Email" class="text-danger"/>
|
|
</div>
|
|
<div class="form-floating mb-3">
|
|
<InputText type="password" @bind-Value="Input.Password" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Please enter your password."/>
|
|
<label for="password" class="form-label">Password</label>
|
|
<ValidationMessage For="() => Input.Password" class="text-danger"/>
|
|
</div>
|
|
<div class="form-floating mb-3">
|
|
<InputText type="password" @bind-Value="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Please confirm your password."/>
|
|
<label for="confirm-password" class="form-label">Confirm password</label>
|
|
<ValidationMessage For="() => Input.ConfirmPassword" class="text-danger"/>
|
|
</div>
|
|
<button type="submit" class="w-100 btn btn-lg btn-primary">Reset</button>
|
|
</EditForm>
|
|
</div>
|
|
</div>
|
|
|
|
@code {
|
|
private IEnumerable<IdentityError>? identityErrors;
|
|
|
|
[SupplyParameterFromForm] private InputModel Input { get; set; } = new();
|
|
|
|
[SupplyParameterFromQuery] private string? Code { get; set; }
|
|
|
|
private string? Message => identityErrors is null ? null : $"Error: {string.Join(", ", identityErrors.Select(error => error.Description))}";
|
|
|
|
protected override void OnInitialized()
|
|
{
|
|
if (Code is null)
|
|
{
|
|
RedirectManager.RedirectTo("Account/InvalidPasswordReset");
|
|
}
|
|
|
|
Input.Code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(Code));
|
|
}
|
|
|
|
private async Task OnValidSubmitAsync()
|
|
{
|
|
var user = await UserManager.FindByEmailAsync(Input.Email);
|
|
if (user is null)
|
|
{
|
|
// Don't reveal that the user does not exist
|
|
RedirectManager.RedirectTo("Account/ResetPasswordConfirmation");
|
|
}
|
|
|
|
var result = await UserManager.ResetPasswordAsync(user, Input.Code, Input.Password);
|
|
if (result.Succeeded)
|
|
{
|
|
RedirectManager.RedirectTo("Account/ResetPasswordConfirmation");
|
|
}
|
|
|
|
identityErrors = result.Errors;
|
|
}
|
|
|
|
private sealed 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; } = "";
|
|
|
|
[Required] public string Code { get; set; } = "";
|
|
}
|
|
|
|
} |