Files
Aaru.Server/Aaru.Server.New/Components/Account/Pages/Manage/ChangePassword.razor

98 lines
4.0 KiB
Plaintext

@page "/Account/Manage/ChangePassword"
@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity
@inject UserManager<IdentityUser> UserManager
@inject SignInManager<IdentityUser> SignInManager
@inject IdentityUserAccessor UserAccessor
@inject IdentityRedirectManager RedirectManager
@inject ILogger<ChangePassword> Logger
<PageTitle>Change password</PageTitle>
<h3>Change password</h3>
<StatusMessage Message="@message"/>
<div class="row">
<div class="col-md-6">
<EditForm FormName="change-password" method="post" Model="Input" OnValidSubmit="OnValidSubmitAsync">
<DataAnnotationsValidator/>
<ValidationSummary class="text-danger" role="alert"/>
<div class="form-floating mb-3">
<InputText aria-required="true" autocomplete="current-password" @bind-Value="Input.OldPassword" class="form-control" placeholder="Please enter your old password." type="password"/>
<label class="form-label" for="old-password">Old password</label>
<ValidationMessage class="text-danger" For="() => Input.OldPassword"/>
</div>
<div class="form-floating mb-3">
<InputText aria-required="true" autocomplete="new-password" @bind-Value="Input.NewPassword" class="form-control" placeholder="Please enter your new password." type="password"/>
<label class="form-label" for="new-password">New password</label>
<ValidationMessage class="text-danger" For="() => Input.NewPassword"/>
</div>
<div class="form-floating mb-3">
<InputText aria-required="true" autocomplete="new-password" @bind-Value="Input.ConfirmPassword" class="form-control" placeholder="Please confirm your new password." type="password"/>
<label class="form-label" for="confirm-password">Confirm password</label>
<ValidationMessage class="text-danger" For="() => Input.ConfirmPassword"/>
</div>
<button class="btn btn-lg btn-primary w-100" type="submit">Update password</button>
</EditForm>
</div>
</div>
@code {
private string? message;
private IdentityUser user = default!;
private bool hasPassword;
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
protected override async Task OnInitializedAsync()
{
user = await UserAccessor.GetRequiredUserAsync(HttpContext);
hasPassword = await UserManager.HasPasswordAsync(user);
if(!hasPassword)
{
RedirectManager.RedirectTo("Account/Manage/SetPassword");
}
}
private async Task OnValidSubmitAsync()
{
IdentityResult changePasswordResult = await UserManager.ChangePasswordAsync(user, Input.OldPassword, Input.NewPassword);
if(!changePasswordResult.Succeeded)
{
message = $"Error: {string.Join(",", changePasswordResult.Errors.Select(error => error.Description))}";
return;
}
await SignInManager.RefreshSignInAsync(user);
Logger.LogInformation("User changed their password successfully.");
RedirectManager.RedirectToCurrentPageWithStatus("Your password has been changed", HttpContext);
}
private sealed class InputModel
{
[Required]
[DataType(DataType.Password)]
[Display(Name = "Current password")]
public string OldPassword { get; set; } = "";
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "New password")]
public string NewPassword { get; set; } = "";
[DataType(DataType.Password)]
[Display(Name = "Confirm new password")]
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; } = "";
}
}