Đây là một câu hỏi phức tạp và không có câu trả lời đúng nhưng có một số cách để làm điều đó. Trước tiên tôi sẽ cho rằng bạn đang sử dụng auth auth bằng cách sử dụng jwt dựa trên yêu cầu, cách đơn giản nhất là viết Chính sách của riêng bạn để đọc vai trò của người dùng trước mỗi yêu cầu, đây là cách đơn giản nhất để thực hiện và nhanh nhất để thực hiện.
internal class DatabaseRoles : IAuthorizationRequirement
{
public string Role { get; }
public DatabaseRoles(string role)
{
Role = role;
}
}
internal class DatabaseRolesHandler : AuthorizationHandler<DatabaseRoles>
{
private readonly UserManager<IdentityUser> userManager;
public DatabaseRolesHandler(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager)
{
this.userManager = userManager;
}
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, DatabaseRoles requirement)
{
//NOTE this is the out of the box implementation of roles and simple query to get the roles from the EF backed database. I would recoment makeing a custom privelages store for this and not using roles for this but access rights
var user = await userManager.FindByIdAsync(userManager.GetUserId(context.User));
if (await userManager.IsInRoleAsync(user, requirement.Role))
{
context.Succeed(requirement);
}
}
}
Nhưng giải pháp này không phải là hiệu suất vì nó yêu cầu một cuộc gọi đến cơ sở dữ liệu theo mọi yêu cầu. Điều này tốt trên tải nhỏ nhưng có thể tạo ra vấn đề trong giao thông. Một cách khác là gọi lại tất cả các mã thông báo người dùng khi vai trò thay đổi nhưng điều này siêu phức tạp. Tôi chắc chắn nếu bạn tạo một số cửa hàng truy cập nhanh cho các vai trò như redis, sẽ không có vấn đề gì để thực hiện kiểm tra trên mỗi cuộc gọi. Ngoài ra, tôi không khuyên bạn nên tạo bộ nhớ người dùng của riêng mình vì đó là một cơn ác mộng để duy trì và cập nhật liên quan đến các tiêu chuẩn bảo mật.
Authorize(Roles ="Staff")
đảm bảo rằng người dùng có vai tròStaff
chỉ có thể truy cập hành động này ... Vì vậy, nếu người dùng bị xóa khỏi vai trò này, người dùng sẽ không thể truy cập vào điều này .. Điều này có xảy ra không?