@rendermode InteractiveServer @using Microsoft.AspNetCore.Identity @using RobotNet.IdentityServer.Data @using MudBlazor @using System.Net.Http.Json @using Microsoft.AspNetCore.Components @using System.Threading @using System.ComponentModel.DataAnnotations @using RobotNet.IdentityServer.Services @inherits LayoutComponentBase @inject AuthenticationStateProvider AuthenticationStateProvider @inject PasswordStrengthService PasswordStrengthService @inject UserManager UserManager @inject ISnackbar Snackbar @inject NavigationManager NavigationManager
Đổi mật khẩu Cập nhật mật khẩu để tăng cường bảo mật
@if (!string.IsNullOrEmpty(model.NewPassword)) {
Độ mạnh: @GetPasswordStrengthText()
Yêu cầu:
Tối thiểu 6 ký tự
@*
Chữ hoa
*@
Chữ thường
@*
Số
Ký tự đặc biệt
*@
}
@if (!string.IsNullOrEmpty(model.NewPassword) && !string.IsNullOrEmpty(model.ConfirmPassword)) { @(model.NewPassword == model.ConfirmPassword ? "Mật khẩu khớp" : "Mật khẩu không khớp") }
@if (!string.IsNullOrEmpty(errorMessage)) { @errorMessage }
Hủy @if (isProcessing) { Đang xử lý... } else { Lưu }
@code { private bool isButtonDisabled = true; private bool showCurrentPassword = false; private bool showNewPassword = false; private bool showConfirmPassword = false; private ChangePasswordModel model = new(); private bool isProcessing = false; private string errorMessage = string.Empty; private EditForm? editForm; private class ChangePasswordModel { [Required(ErrorMessage = "Vui lòng nhập mật khẩu hiện tại")] public string CurrentPassword { get; set; } = string.Empty; [Required(ErrorMessage = "Vui lòng nhập mật khẩu mới")] [StringLength(100, ErrorMessage = "Mật khẩu phải từ {2} đến {1} ký tự", MinimumLength = 8)] public string NewPassword { get; set; } = string.Empty; [Required(ErrorMessage = "Vui lòng xác nhận mật khẩu mới")] [Compare("NewPassword", ErrorMessage = "Mật khẩu xác nhận không khớp")] public string ConfirmPassword { get; set; } = string.Empty; } private void EnableButtons() { isButtonDisabled = false; } private void OnNewPasswordChanged(ChangeEventArgs e) { model.NewPassword = e.Value?.ToString() ?? string.Empty; StateHasChanged(); } private async Task SubmitForm() { if (editForm?.EditContext?.Validate() == true) { await ChangePassword(); } else { Snackbar.Add("Vui lòng kiểm tra lại thông tin nhập", Severity.Error); } } private int GetPasswordStrength() { return PasswordStrengthService.EvaluatePasswordStrength(model.NewPassword); } private Color GetPasswordStrengthColor() { return PasswordStrengthService.GetStrengthColor(GetPasswordStrength()); } private string GetPasswordStrengthText() { return PasswordStrengthService.GetStrengthDescription(GetPasswordStrength()); } protected override async Task OnInitializedAsync() { var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); if (authState?.User?.Identity?.IsAuthenticated != true) { Snackbar.Add("Vui lòng đăng nhập", Severity.Error); NavigationManager.NavigateTo("/Account/Login"); } } private async Task ChangePassword() { isProcessing = true; errorMessage = string.Empty; try { var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); var user = await UserManager.GetUserAsync(authState.User); if (user == null) { Snackbar.Add("Không tìm thấy thông tin người dùng", Severity.Error); return; } var result = await UserManager.ChangePasswordAsync(user, model.CurrentPassword, model.NewPassword); if (result.Succeeded) { Snackbar.Add("Đổi mật khẩu thành công", Severity.Success); model = new ChangePasswordModel(); isButtonDisabled = true; } else { errorMessage = string.Join(", ", result.Errors.Select(e => e.Description)); Snackbar.Add(errorMessage, Severity.Error); } } catch (Exception ex) { errorMessage = $"Lỗi: {ex.Message}"; Snackbar.Add(errorMessage, Severity.Error); } finally { isProcessing = false; StateHasChanged(); } } private void Cancel() { model = new ChangePasswordModel(); isButtonDisabled = true; errorMessage = string.Empty; StateHasChanged(); } }