Hệ thống ủy quyền trong ASP.NET Core hỗ trợ ba phương thức ủy quyền chính: Policy, Roles, AuthenticationSchemes
Ủy quyền dựa trên vai trò
Ủy quyền dựa trên vai trò là một khái niệm quen thuộc với nhiều người phát triển, cách sử dụng như sau:
[Authorize(Roles = "Admin")] // Nhiều vai trò có thể được phân tách bằng dấu phẩy
public class SampleDataController : Controller
{
...
}
Logic của ủy quyền dựa trên vai trò tương tự như trong ASP.NET 4.x, đều sử dụng phương thức IsInRole mà tôi đã giới thiệu trong bài viết "Khám phá xác thực" để thực hiện.
Ủy quyền dựa trên Scheme
Về AuthenticationScheme, tôi đã đề cập đến nó trong các chương trước, ví dụ như Scheme mặc định cho xác thực cookie là Cookies, và Scheme mặc định trong xác thực JwtBearer là Bearer.
Khi học về xác thực trước đây, tôi từng thắc mắc làm thế nào có thể sử dụng cả cookie và bearer cùng lúc? Vì trong quá trình xác thực chỉ có thể thiết lập một Scheme duy nhất. Đến khi hiểu rõ phần này thì mọi thứ trở nên rõ ràng hơn, sẽ giải thích chi tiết hơn ở phần sau.
[Authorize(AuthenticationSchemes = "Cookies")] // Nhiều Scheme có thể được phân tách bằng dấu phẩy
public class SampleDataController : Controller
{
...
}
Khi ứng dụng của bạn sử dụng nhiều scheme xác thực khác nhau, thì phương pháp ủy quyền dựa trên AuthenticationScheme rất hữu ích. Trong chế độ này, hệ thống sẽ gọi context.AuthenticateAsync(scheme) để lấy lại các Claims mới.
Ủy quyền dựa trên chính sách
Trong ASP.NET Core, một cách ủy quyền linh hoạt hơn đã được thiết kế lại: ủy quyền dựa trên chính sách – đây cũng là cốt lõi của toàn bộ cơ chế ủy quyền.
Để sử dụng ủy quyền dựa trên chính sách, bạn cần định nghĩa các chính sách ủy quyền, mà bản chất của chính sách là các điều kiện kiểm tra đối với Claims.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthorization(options =>
{
options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
});
}
Chính sách ủy quyền là phương pháp linh hoạt nhất và cũng là nền tảng cho hai phương thức còn lại.
Địa chỉ demo: https://gitee.com/xiaoqingyao/authentication-netcore/tree/master/Authorization-Policy
Chính sách có thể kiểm tra trực tiếp sự tồn tại của một claim, giá trị cụ thể của claim hoặc kết hợp nhiều điều kiện phức tạp hơn.
services.AddAuthorization(options =>
{
// Xác thực thành viên
options.AddPolicy("MemberOnly", p =>
{
p.RequireClaim("Name"); // Phải chứa Claim cụ thể
});
// Kiểm tra một Claim nào đó
options.AddPolicy("User", policy => policy
.RequireAssertion(context => context.User.HasClaim(c => (c.Type == "EmployeeNumber" || c.Type == "Role")))
);
// Kết hợp nhiều điều kiện
options.AddPolicy("Employee", policy => policy
.RequireRole("Admin") // Vai trò
.RequireUserName("Alice") // Tên người dùng
.RequireClaim("EmployeeNumber") // Claim bắt buộc
.Combine(commonPolicy)); // Kết hợp chính sách khác
// Chính sách tùy chỉnh
options.AddPolicy("Over18", p => p.Requirements.Add(new MinimumAgeRequirement(18)));
// Xử lý đa yêu cầu
options.AddPolicy("Anbu", p => p.Requirements.Add(new AnBuEnterRequirement()));
});
Nguồn: https://www.cnblogs.com/RainingNight/p/authorization-in-asp-net-core.html