@page "/Account/Rolemanager" @rendermode InteractiveServer @attribute [Authorize] @using Microsoft.AspNetCore.Authorization @using MudBlazor @using System.Net.Http.Json @using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Components @using RobotNet.IdentityServer.Data @using Microsoft.EntityFrameworkCore @using System.Threading @inherits LayoutComponentBase @inject AuthenticationStateProvider AuthenticationStateProvider @inject UserManager UserManager @inject RoleManager RoleManager @inject ISnackbar Snackbar @inject IDialogService DialogService @inject NavigationManager NavigationManager
Role Management Quản lý vai trò và phân quyền người dùng
@Roles.Count Tổng số vai trò
Danh Sách Vai Trò
Tạo Vai Trò Mới
Tên Vai Trò Thao Tác
@context.Name
@if (LoggedInUserRoles.Contains(context.Name ?? string.Empty)) { } else { }
Quản Lý Người Dùng
Người Dùng Vai Trò Thao Tác
@(context.UserName?.Substring(0, 1).ToUpper())
@context.UserName @if (context.UserId == LoggedInUserId) { Bạn }
@if (context.Roles.Any()) { foreach (var role in context.Roles) { @role } } else { Chưa có vai trò }
@if (context.UserId == LoggedInUserId) { } else { }
Tạo Vai Trò Mới
Tạo Hủy
Chỉnh Sửa Vai Trò
Lưu Hủy
Xác Nhận Xóa
Bạn có chắc chắn muốn xóa vai trò @RoleNameToDelete? Hành động này không thể hoàn tác. Xóa Hủy
Quản Lý Vai Trò: @SelectedUserName
Vai Trò Hiện Tại
@if (AssignedRoles.Any()) { foreach (var role in AssignedRoles) { if (role.Equals("Administrator", StringComparison.OrdinalIgnoreCase)) { @role (Được bảo vệ) } else { @role } } } else { Chưa có vai trò nào }
Thêm Vai Trò @foreach (var role in AvailableRoles) {
@role
}
Thêm (@selectedRolesToAdd.Count())
@{ var removableRoles = AssignedRoles .Where(role => !role.Equals("Administrator", StringComparison.OrdinalIgnoreCase)) .ToList(); } @if (removableRoles.Any()) { Xóa Vai Trò @foreach (var role in removableRoles) {
@role
}
Xóa (@selectedRolesToRemove.Count())
}
Đóng
@code { private bool CreateRoleVisible { get; set; } private bool DelRoleVisible { get; set; } private bool EditRoleVisible { get; set; } private bool ManageUserRolesVisible { get; set; } = false; private string CurrentRoleId { get; set; } = ""; private string EditRoleName { get; set; } = ""; private string NewRoleName { get; set; } = ""; private string RoleNameToDelete { get; set; } = ""; private string RoleIdToDelete { get; set; } = ""; private string SelectedUserName { get; set; } = string.Empty; private string UserIdToManageRoles { get; set; } = string.Empty; private string LoggedInUserId { get; set; } = string.Empty; private List LoggedInUserRoles { get; set; } = new(); private List AllRoles { get; set; } = new List(); private List AvailableRoles { get; set; } = new List(); private List AssignedRoles { get; set; } = new List(); private List Roles { get; set; } = new List(); private List UsersWithRoles { get; set; } = new List(); private IEnumerable selectedRolesToAdd = new HashSet(); private IEnumerable selectedRolesToRemove = new HashSet(); private string rowsPerPageString = "Rows:"; private string roleSearchTerm = ""; private string userSearchTerm = ""; private IEnumerable FilteredRoles => string.IsNullOrWhiteSpace(roleSearchTerm) ? Roles : Roles?.Where(r => r.Name != null && r.Name.Contains(roleSearchTerm, StringComparison.OrdinalIgnoreCase)) ?? Enumerable.Empty(); private IEnumerable FilteredUsers => string.IsNullOrWhiteSpace(userSearchTerm) ? UsersWithRoles : UsersWithRoles?.Where(u => u.UserName != null && u.UserName.Contains(userSearchTerm, StringComparison.OrdinalIgnoreCase)) ?? Enumerable.Empty(); private string GetRoleIcon(string roleName) { return roleName?.ToLower() switch { "administrator" => Icons.Material.Filled.SupervisorAccount, "user" => Icons.Material.Filled.Person, "guest" => Icons.Material.Filled.PersonOutline, _ => Icons.Material.Filled.Security }; } private Color GetRoleColor(string roleName) { return roleName?.ToLower() switch { "administrator" => Color.Error, "user" => Color.Primary, "guest" => Color.Default, _ => Color.Info }; } private Color GetRoleChipColor(string roleName) { return roleName?.ToLower() switch { "administrator" => Color.Error, "user" => Color.Primary, "guest" => Color.Default, _ => Color.Info }; } protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); var authenticationState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); var currentUser = authenticationState.User; if (currentUser.Identity?.IsAuthenticated == true) { LoggedInUserId = currentUser.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value ?? string.Empty; var currentUserObj = await UserManager.GetUserAsync(currentUser); if (currentUserObj != null) { LoggedInUserRoles = (await UserManager.GetRolesAsync(currentUserObj)).ToList(); } Roles = await RoleManager.Roles.OrderBy(r => r.CreatedDate).ToListAsync(); await LoadAllRoles(); await LoadUsersWithRoles(); StateHasChanged(); } else { Snackbar.Add("User is not authenticated.", Severity.Error); } } private async Task LoadUsersWithRoles() { try { var users = await UserManager.Users.ToListAsync(); if (users == null || !users.Any()) { Snackbar.Add("No users found.", Severity.Error); return; } var userRoleList = new List(); foreach (var user in users) { var userRoles = await UserManager.GetRolesAsync(user); userRoleList.Add(new UserRoleModel { UserName = user.UserName, Roles = userRoles.ToList(), UserId = user.Id }); } UsersWithRoles = userRoleList.OrderBy(u => u.UserId == LoggedInUserId ? 0 : 1).ToList(); StateHasChanged(); } catch (Exception ex) { Snackbar.Add($"Lỗi khi tải người dùng và role: {ex.Message}", Severity.Error); UsersWithRoles = new List(); } } private async Task LoadAllRoles() { try { var roles = await RoleManager.Roles .Select(role => role.Name) .ToListAsync(); AllRoles = roles.Where(name => !string.IsNullOrEmpty(name)).Cast().ToList() ?? new List(); if (!AllRoles.Any()) { Snackbar.Add("Không tìm thấy vai trò nào.", Severity.Warning); } } catch (Exception ex) { Snackbar.Add($"Lỗi khi tải danh sách vai trò: {ex.Message}", Severity.Error); AllRoles = new List(); } } private void AddRole() { CreateRoleVisible = true; StateHasChanged(); } private void DelRole(string roleId, string roleName) { RoleIdToDelete = roleId; RoleNameToDelete = roleName; DelRoleVisible = true; StateHasChanged(); } private void EditRole(ApplicationRole role) { if (role?.Name is not null) { CurrentRoleId = role.Id; EditRoleName = role.Name; EditRoleVisible = true; StateHasChanged(); } else { Snackbar.Add("Role information is incomplete or invalid.", Severity.Error); } } private async Task ManageUserRoles(string userId, string userName) { if (!LoggedInUserRoles.Contains("Administrator")) { Snackbar.Add("Bạn không có quyền quản lý role của user khác.", Severity.Error); return; } if (!AllRoles.Any()) { Snackbar.Add("Không có vai trò nào có thể chỉ định", Severity.Warning); return; } SelectedUserName = userName; UserIdToManageRoles = userId; var user = await UserManager.FindByIdAsync(userId); if (user != null) { var userRoles = await UserManager.GetRolesAsync(user); AssignedRoles = userRoles.ToList(); AvailableRoles = AllRoles .Except(userRoles) .Where(role => !role.Equals("Administrator", StringComparison.OrdinalIgnoreCase)) .ToList(); } selectedRolesToAdd = new HashSet(); selectedRolesToRemove = new HashSet(); ManageUserRolesVisible = true; StateHasChanged(); } private async Task AddSelectedRolesToUser() { foreach (var role in selectedRolesToAdd.ToList()) { await AddRoleToSelectedUser(role); } selectedRolesToAdd = new HashSet(); StateHasChanged(); } private async Task RemoveSelectedRolesFromUser() { foreach (var role in selectedRolesToRemove.ToList()) { await RemoveRoleFromSelectedUser(role); } selectedRolesToRemove = new HashSet(); StateHasChanged(); } private async Task AddRoleToSelectedUser(string roleName) { if (roleName.Equals("Administrator", StringComparison.OrdinalIgnoreCase)) { Snackbar.Add("Không thể gán role Admin cho user khác.", Severity.Error); return; } if (!LoggedInUserRoles.Contains("Administrator")) { Snackbar.Add("Bạn không có quyền thực hiện thao tác này.", Severity.Error); return; } var user = await UserManager.FindByIdAsync(UserIdToManageRoles); if (user != null) { var result = await UserManager.AddToRoleAsync(user, roleName); if (result.Succeeded) { AssignedRoles.Add(roleName); AvailableRoles.Remove(roleName); selectedRolesToAdd = selectedRolesToAdd.Where(r => r != roleName); Snackbar.Add($"Thêm role '{roleName}' cho {SelectedUserName} Thành Công.", Severity.Success); await LoadUsersWithRoles(); StateHasChanged(); } else { Snackbar.Add($"Failed to add role '{roleName}' to user.", Severity.Error); } } } private async Task RemoveRoleFromSelectedUser(string roleName) { if (roleName.Equals("Administrator", StringComparison.OrdinalIgnoreCase)) { Snackbar.Add("Không thể xóa role Admin của user.", Severity.Error); return; } if (!LoggedInUserRoles.Contains("Administrator")) { Snackbar.Add("Bạn không có quyền thực hiện thao tác này.", Severity.Error); return; } var user = await UserManager.FindByIdAsync(UserIdToManageRoles); if (user != null) { var result = await UserManager.RemoveFromRoleAsync(user, roleName); if (result.Succeeded) { AssignedRoles.Remove(roleName); AvailableRoles.Add(roleName); selectedRolesToRemove = selectedRolesToRemove.Where(r => r != roleName); Snackbar.Add($"Thành công xoá role '{roleName}' của {SelectedUserName}.", Severity.Success); await LoadUsersWithRoles(); StateHasChanged(); } else { Snackbar.Add($"Failed to remove role '{roleName}' from user.", Severity.Error); } } } private async Task CreateRole() { if (string.IsNullOrWhiteSpace(NewRoleName)) { Snackbar.Add(" Tên Role không được để trống.", Severity.Error); StateHasChanged(); return; } var roleExist = await RoleManager.RoleExistsAsync(NewRoleName.ToUpper()); if (roleExist) { Snackbar.Add(" Role đã tồn tại.", Severity.Warning); CreateRoleVisible = false; NewRoleName = ""; StateHasChanged(); return; } var newRole = new ApplicationRole { Name = NewRoleName, NormalizedName = NewRoleName.ToUpper(), CreatedDate = DateTime.UtcNow }; var result = await RoleManager.CreateAsync(newRole); if (result.Succeeded) { Roles.Add(newRole); Snackbar.Add(" Tạo Role thành công!", Severity.Success); await LoadAllRoles(); CreateRoleVisible = false; NewRoleName = ""; StateHasChanged(); } else { Snackbar.Add(" Tạo Role thất bại.", Severity.Error); StateHasChanged(); } } private async Task SaveEditRole() { if (string.IsNullOrWhiteSpace(EditRoleName)) { Snackbar.Add("Tên Role không được để trống.", Severity.Error); StateHasChanged(); return; } var role = await RoleManager.FindByIdAsync(CurrentRoleId); if (role != null) { role.Name = EditRoleName; role.NormalizedName = EditRoleName.ToUpper(); var result = await RoleManager.UpdateAsync(role); if (result.Succeeded) { var existingRole = Roles.FirstOrDefault(r => r.Id == role.Id); if (existingRole != null) { existingRole.Name = role.Name; } Snackbar.Add("Role đã được sửa thành công!", Severity.Success); await LoadAllRoles(); await LoadUsersWithRoles(); EditRoleVisible = false; EditRoleName = ""; StateHasChanged(); } else { Snackbar.Add("Sửa Role thất bại.", Severity.Error); EditRoleVisible = false; StateHasChanged(); } } else { Snackbar.Add("Không tìm thấy role với ID đã cho.", Severity.Error); EditRoleVisible = false; StateHasChanged(); } } private async Task ConfirmDelRole() { if (string.IsNullOrEmpty(RoleIdToDelete)) { Snackbar.Add(" Không tìm thấy Role để xóa.", Severity.Error); return; } var role = await RoleManager.FindByIdAsync(RoleIdToDelete); if (role != null) { var result = await RoleManager.DeleteAsync(role); if (result.Succeeded) { Snackbar.Add(" Đã xóa Role thành công.", Severity.Success); Roles = await RoleManager.Roles .OrderBy(r => r.CreatedDate) .ToListAsync(); await LoadAllRoles(); await LoadUsersWithRoles(); } else { Snackbar.Add(" Xóa Role thất bại.", Severity.Error); } } else { Snackbar.Add(" Không tìm thấy Role để xóa.", Severity.Error); } DelRoleVisible = false; RoleIdToDelete = ""; StateHasChanged(); } public class UserRoleModel { public string? UserName { get; set; } public List Roles { get; set; } = new List(); public string? UserId { get; set; } } }