ASP.NET Core: Tổng quan về chứng thực (authentication) trong ASP.NET Core
Chứng thực (Authentication) là quá trình xác định danh tính của người dùng. Ủy quyền (Authorization) là quá trình xác định xem người dùng có quyền truy cập vào tài nguyên hay không. Trong ASP.NET Core, việc chứng thực được xử lý bởi dịch vụ chứng thực là IAuthenticationService, được sử dụng bởi chứng thực middleware. Dịch vụ chứng thực sử dụng trình xử lý chứng thực đã đăng ký để hoàn thành các action liên quan đến chứng thực. Ví dụ về các action liên quan đến chứng thực bao gồm:
- Chứng thực người dùng.
- Phản hồi khi người dùng không được chứng thực cố gắng truy cập tài nguyên bị hạn chế.
Trình xử lý chứng thực đã đăng ký và các tùy chọn cấu hình của chúng được gọi là "sơ đồ".
Các sơ đồ chứng thực được chỉ định bằng cách đăng ký dịch vụ chứng thực trong Startup.ConfigureServices
:
- Bằng cách gọi một phương thức tiện ích mở rộng dành riêng cho lược đồ sau lệnh gọi tới AddAuthentication (chẳng hạn như AddJwtBearer hoặc AddCookie chẳng hạn). Các phương thức mở rộng này sử dụng AuthenticationBuilder.AddScheme để đăng ký các lược đồ với cài đặt thích hợp.
- Ít phổ biến hơn, bằng cách gọi
AuthenticationBuilder.AddScheme
trực tiếp.
Ví dụ: đoạn code sau đăng ký các dịch vụ chứng thực và trình xử lý cho các lược đồ chứng thực mang cookie và JWT:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,
options => Configuration.Bind("JwtSettings", options))
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
options => Configuration.Bind("CookieSettings", options));
Tham số AddAuthentication
JwtBearerDefaults.AuthenticationScheme là tên của lược đồ được sử dụng theo mặc định khi không yêu cầu một lược đồ cụ thể.
Nếu sử dụng nhiều lược đồ, các chính sách ủy quyền (hoặc attribute ủy quyền) có thể chỉ định lược đồ chứng thực (hoặc các lược đồ) mà chúng phụ thuộc vào để chứng thực người dùng. Trong ví dụ trên, lược đồ chứng thực cookie có thể được sử dụng bằng cách chỉ định tên của nó (CookieAuthenticationDefaults.AuthenticationScheme theo mặc định, mặc dù có thể cung cấp tên khác khi gọi AddCookie
).
Trong một số trường hợp, lệnh gọi đến AddAuthentication
được thực hiện tự động bằng các phương thức tiện ích mở rộng khác. Ví dụ: khi sử dụng ASP.NET Core Identity, thì AddAuthentication
được gọi nội bộ.
Middleware chứng thực được thêm vào Startup.Configure
bằng cách gọi UseAuthentication. Việc gọi UseAuthentication
sẽ đăng ký middleware sử dụng các lược đồ chứng thực đã đăng ký trước đó. Gọi UseAuthentication
trước bất kỳ middleware nào phụ thuộc vào việc người dùng được chứng thực. Khi sử dụng route điểm cuối, lệnh gọi UseAuthentication
phải thực hiện:
- Sau UseRouting, để có thông tin route cho các quyết định chứng thực.
- Trước UseEndpoints, để người dùng được chứng thực trước khi truy cập vào điểm cuối.
Khái niệm chứng thực
Chứng thực có trách nhiệm cung cấp ClaimsPrincipal để được ủy quyền đưa ra quyết định cấp phép. Có nhiều cách tiếp cận sơ đồ chứng thực để chọn trình xử lý chứng thực nào chịu trách nhiệm tạo tập hợp xác nhận quyền sở hữu chính xác:
- Lược đồ chứng thực
- Lược đồ chứng thực mặc định sẽ được thảo luận trong phần tiếp theo.
- Đặt trực tiếp HttpContext.User.
Không có sự thăm dò tự động của các kế hoạch. Nếu lược đồ mặc định không được chỉ định thì lược đồ phải được chỉ định trong thuộc tính ủy quyền, nếu không, lỗi sau sẽ xảy ra:
InvalidOperationException: No authenticationScheme was specified, and there was no DefaultAuthenticateScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action<AuthenticationOptions> configureOptions).
Lược đồ chứng thực
Lược đồ chứng thực có thể chọn trình xử lý chứng thực nào chịu trách nhiệm tạo ra tập hợp xác nhận quyền sở hữu chính xác. Để biết thêm thông tin, hãy xem Ủy quyền với một chương trình cụ thể.
Lược đồ chứng thực là tên tương ứng với:
- Một trình xử lý chứng thực.
- Các tùy chọn để định cấu hình phiên bản cụ thể của trình xử lý.
Lược đồ hữu ích như một cơ chế đề cập đến các hành vi chứng thực, thách thức và cấm của trình xử lý liên quan. Ví dụ: chính sách ủy quyền có thể sử dụng tên lược đồ để chỉ định lược đồ (hoặc các lược đồ) chứng thực nào sẽ được sử dụng để chứng thực người dùng. Khi định cấu hình chứng thực, thông thường phải chỉ định sơ đồ chứng thực mặc định. Lược đồ mặc định được sử dụng trừ khi tài nguyên yêu cầu một lược đồ cụ thể. Cũng có thể:
- Chỉ định các lược đồ mặc định khác nhau để sử dụng cho các hành động chứng thực, thách thức và cấm.
- Kết hợp nhiều sơ đồ thành một bằng cách sử dụng các lược đồ chính sách.
Trình xử lý chứng thực
Trình xử lý chứng thực:
- Là một kiểu thực thi hành vi của một lược đồ.
- Có nguồn gốc từ IAuthenticationHandler hoặc AuthenticationHandler<TOptions>.
- Có trách nhiệm chính trong việc chứng thực người dùng.
Dựa trên cấu hình của lược đồ chứng thực và bối cảnh yêu cầu đến, trình xử lý chứng thực:
- Xây dựng các đối tượng AuthenticationTicket thể hiện danh tính của người dùng nếu chứng thực thành công.
- Trả về 'no result' hoặc 'failure' nếu chứng thực không thành công.
- Có các phương pháp thách thức và cấm các hành động khi người dùng cố gắng truy cập tài nguyên:
- Họ không được phép truy cập (forbid).
- Khi chúng không được xác thực (challenge).
RemoteAuthenticationHandler<TOptions>
so với AuthenticationHandler<TOptions>
RemoteAuthenticationHandler<TOptions> là lớp chứng thực yêu cầu bước chứng thực từ xa. Khi bước chứng thực từ xa kết thúc, trình xử lý sẽ gọi lại tới CallbackPath
do trình xử lý thiết lập. Trình xử lý kết thúc bước chứng thực bằng cách sử dụng thông tin được truyền đến đường dẫn gọi lại HandleRemoteAuthenticateAsync. OAuth 2.0 và OIDC đều sử dụng mẫu này. JWT và cookie thì không vì chúng có thể trực tiếp sử dụng header và cookie mang để chứng thực. Nhà cung cấp dịch vụ lưu trữ từ xa trong trường hợp này:
- Là nhà cung cấp chứng thực.
- Các ví dụ bao gồm Facebook, Twitter, Google, Microsoft và bất kỳ nhà cung cấp OIDC nào khác xử lý việc xác thực người dùng bằng cơ chế xử lý.
Chứng thực
Hành động chứng thực của lược đồ chứng thực chịu trách nhiệm xây dựng danh tính người dùng dựa trên ngữ cảnh yêu cầu. Nó trả về AuthenticateResult cho biết chứng thực có thành công hay không và nếu có thì danh tính của người dùng trong phiếu chứng thực. Xem AuthenticateAsync. Các ví dụ xác thực bao gồm:
- Lược đồ chứng thực cookie xây dựng danh tính người dùng từ cookie.
- Lược đồ mang JWT giải tuần tự hóa và chứng thực mã thông báo mang JWT để xây dựng danh tính của người dùng.
Thử thách
Thử thách chứng thực được Ủy quyền đưa ra khi người dùng chưa được chứng thực yêu cầu điểm cuối yêu cầu chứng thực. Ví dụ: một thử thách chứng thực được đưa ra khi người dùng ẩn danh yêu cầu tài nguyên bị hạn chế hoặc theo liên kết đăng nhập. Việc ủy quyền đưa ra một thử thách bằng cách sử dụng (các) lược đồ chứng thực được chỉ định hoặc mặc định nếu không có lược đồ nào được chỉ định. Xem ChallengeAsync. Các ví dụ về thử thách chứng thực bao gồm:
- Lược đồ chứng thực cookie chuyển hướng người dùng đến trang đăng nhập.
- Lược đồ mang JWT trả về kết quả 401 kèm theo header
www-authenticate: bearer
.
Hành động thử thách phải cho người dùng biết nên sử dụng cơ chế chứng thực nào để truy cập tài nguyên được yêu cầu.
Ngăn cấm (Forbid)
Hành động cấm của sơ đồ chứng thực được Ủy quyền gọi khi người dùng được chứng thực cố gắng truy cập vào tài nguyên mà họ không được phép truy cập. Xem ForbidAsync. Các ví dụ cấm chứng thực bao gồm:
- Lược đồ chứng thực cookie chuyển hướng người dùng đến một trang cho biết quyền truy cập bị cấm.
- Lược đồ mang JWT trả về kết quả 403.
- Lược đồ chứng thực tùy chỉnh chuyển hướng đến một trang nơi người dùng có thể yêu cầu quyền truy cập vào tài nguyên.
Một hành động cấm có thể cho người dùng biết:
- Họ đã được chứng thực.
- Họ không được phép truy cập vào tài nguyên được yêu cầu.
Xem các liên kết sau để biết sự khác biệt giữa thử thách và ngăn cấm:
- Thử thách và ngăn cấm bằng trình xử lý tài nguyên hoạt động.
- Sự khác biệt giữa thử thách và ngăn cấm.
Nhà cung cấp chứng thực cho mỗi đối tượng thuê
Framework ASP.NET Core không có giải pháp tích hợp sẵn để chứng thực nhiều người thuê. Mặc dù khách hàng có thể viết ứng dụng có chứng thực nhiều bên thuê nhưng lời khuyên là bạn nên sử dụng một trong các khung ứng dụng cốt lõi asp.net sau đây để hỗ trợ chứng thực nhiều bên thuê:
Orchard Core
Orchard Core. Xem nguồn Orchard Core để biết ví dụ về nhà cung cấp dịch vụ chứng thực cho mỗi đối tượng thuê.
ABP Framework
ABP Framework hỗ trợ các mẫu kiến trúc khác nhau bao gồm tính mô-đun, dịch vụ vi mô, thiết kế hướng miền và nhiều bên thuê. Xem nguồng ABP Framework trên GitHub.
Tài nguyên bổ sung
- Ủy quyền với một sơ đồ cụ thể trong ASP.NET Core
- Các lược đồ chính sách trong ASP.NET Core
- Tạo ứng dụng ASP.NET Core với dữ liệu người dùng được bảo vệ bằng ủy quyền
- Toàn cục cầu yêu cầu người dùng được chứng thực
- Sự cố GitHub về việc sử dụng nhiều phương thức chứng thực