ASP.NET Core Docs

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

"Bạn là ai?" — Xác thực danh tính
  • Kiểm tra credentials (username/password)
  • Xác minh token (JWT, cookie)
  • Tạo ClaimsPrincipal cho user
  • Trả về 401 Unauthorized nếu thất bại
  • Ví dụ: đăng nhập bằng Google, Facebook
🛡

Authorization

"Bạn được làm gì?" — Phân quyền truy cập
  • Kiểm tra roles (Admin, User, Editor)
  • Đánh giá policies và requirements
  • Kiểm tra claims của user
  • Trả về 403 Forbidden nếu thất bại
  • Ví dụ: chỉ Admin mới được xóa bài
Authentication luôn xảy ra trước Authorization. Bạn phải biết user là ai trước khi quyết định họ được làm . Giống như bảo vệ kiểm tra thẻ nhân viên (AuthN) trước khi kiểm tra bạn có quyền vào phòng server không (AuthZ).

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:

Request
HTTP vào
Routing
chọn endpoint
AuthN
xác thực
AuthZ
phân quyền
Endpoint
xử lý
C#
// 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)
Thứ tự gọi UseAuthentication() trước UseAuthorization()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:

ClaimsPrincipal Identity +

Đạ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.

ClaimsIdentity Identity +

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).

Claim Identity +

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.

Authentication Scheme AuthN +

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õ.

Authorization Policy AuthZ +

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 = "...")].

Authorization Handler AuthZ +

"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:

CLAIMS PRINCIPAL (HttpContext.User)
ClaimsIdentity: "Cookies"
Name = "Nguyen Van A"
Role = "Admin"
Email = "a@bug.dev"
ClaimsIdentity: "Bearer"
sub = "12345"
scope = "api.read"

Khám phá chi tiết

Chọn chủ đề bạn muốn tìm hiểu sâu hơn: