Authentication
& Authorization
Hiểu cách ASP.NET Core xác thực danh tính và phân quyền truy cập
Hai khái niệm cốt lõi
Trước khi đi sâu, hãy phân biệt rõ ràng hai khái niệm thường bị nhầm lẫn:
Authentication
- Kiểm tra credentials (username/password)
- Xác minh token (JWT, cookie)
- Tạo ClaimsPrincipal cho user
- Trả về
401 Unauthorizednếu thất bại - Ví dụ: đăng nhập bằng Google, Facebook
Authorization
- Kiểm tra roles (Admin, User, Editor)
- Đánh giá policies và requirements
- Kiểm tra claims của user
- Trả về
403 Forbiddennếu thất bại - Ví dụ: chỉ Admin mới được xóa bài
Middleware Pipeline
Trong ASP.NET Core, mọi HTTP request đều đi qua một chuỗi middleware theo thứ tự. Authentication và Authorization là hai middleware quan trọng trong chuỗi này:
// Program.cs — Thứ tự middleware rất quan trọng! var app = builder.Build(); app.UseRouting(); // 1. Xác định endpoint nào sẽ xử lý request app.UseAuthentication(); // 2. Xác thực: "Bạn là ai?" app.UseAuthorization(); // 3. Phân quyền: "Bạn được phép không?" app.MapControllers(); // 4. Chạy endpoint (controller action)
UseAuthentication() trước UseAuthorization() là bắt buộc.
Nếu đảo ngược, Authorization sẽ chạy khi chưa biết user là ai — mọi request đều bị từ chối!
Thuật ngữ quan trọng
Những khái niệm nền tảng bạn cần nắm vững trước khi đi sâu:
Đại diện cho "người dùng" trong hệ thống.
Hãy tưởng tượng ClaimsPrincipal như một người mang theo nhiều loại giấy tờ
(identities). Mỗi người có thể có CMND, bằng lái, hộ chiếu — mỗi loại là một
ClaimsIdentity.
Trong mỗi request, bạn truy cập qua HttpContext.User — đó chính là một
ClaimsPrincipal.
Một "giấy tờ tùy thân" chứa các thông tin (claims).
Giống như CMND chứa: họ tên, ngày sinh, địa chỉ — một ClaimsIdentity chứa các
Claim như Name, Email, Role. Mỗi identity gắn liền với một authentication scheme (ví
dụ: "Cookies", "Bearer").
Thuộc tính quan trọng: AuthenticationType — nếu có giá trị, identity được coi là
authenticated (đã xác thực).
Một mẩu thông tin về user, dạng key-value.
Ví dụ: { Type: "role", Value: "Admin" } hoặc
{ Type: "email", Value: "user@bug.dev" }. Claims là đơn vị nhỏ nhất của thông tin danh tính.
Mọi quyết định authorization đều dựa trên claims.
Cách thức xác thực — "công nghệ" dùng để verify user.
Mỗi scheme gồm 3 thành phần: tên (ví dụ: "Cookies", "Bearer"), handler (class xử lý logic xác thực), và options (cấu hình). Hệ thống có thể có nhiều scheme cùng lúc, và bạn chỉ định default scheme để dùng khi không chỉ rõ.
Một "bộ luật" gồm nhiều điều kiện (requirements) phải thỏa mãn.
Ví dụ: policy "CanEditPost" yêu cầu user phải: (1) đã authenticate, (2) có role "Editor" hoặc "Admin",
(3) email đã xác thực. Policy được đăng ký trong Program.cs và gắn vào endpoint qua
[Authorize(Policy = "...")].
"Thẩm phán" đánh giá xem requirement có được thỏa mãn không.
Handler nhận vào AuthorizationHandlerContext và gọi
context.Succeed(requirement) nếu OK, hoặc context.Fail() nếu từ chối. Một
requirement có thể có nhiều handler — chỉ cần một handler gọi Succeed là requirement được
thỏa mãn (trừ khi có handler gọi Fail).
Mô hình Identity
Cách ClaimsPrincipal, ClaimsIdentity, và Claim liên hệ với nhau:
Khám phá chi tiết
Chọn chủ đề bạn muốn tìm hiểu sâu hơn: