Bạn hoàn toàn có thể đạt được điều mình muốn:
services
.AddAuthentication()
.AddJwtBearer("Firebase", options =>
{
options.Authority = "https://securetoken.google.com/my-firebase-project"
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "my-firebase-project"
ValidateAudience = true,
ValidAudience = "my-firebase-project"
ValidateLifetime = true
};
})
.AddJwtBearer("Custom", options =>
{
});
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
});
Hãy xem xét sự khác biệt giữa mã của bạn và mã đó.
AddAuthentication
không có tham số
Nếu bạn đặt một sơ đồ xác thực mặc định, thì trên mọi yêu cầu, phần mềm trung gian xác thực sẽ cố gắng chạy trình xử lý xác thực được liên kết với sơ đồ xác thực mặc định. Vì bây giờ chúng ta có hai chương trình xác thực có thể hiển thị, nên chẳng ích gì khi chạy một trong số chúng.
Sử dụng quá tải khác của AddJwtBearer
Mỗi AddXXX
phương pháp đơn để thêm xác thực đều có một số quá tải:
- Một nơi mà lược đồ xác thực mặc định được liên kết với phương thức xác thực được sử dụng, như bạn có thể thấy ở đây để xác thực cookie
- Một nơi bạn vượt qua, ngoài cấu hình của các tùy chọn, tên của lược đồ xác thực, như trên quá tải này
Bây giờ, vì bạn sử dụng cùng một phương pháp xác thực hai lần nhưng các lược đồ xác thực phải là duy nhất, bạn cần sử dụng quá tải thứ hai.
Cập nhật chính sách mặc định
Vì các yêu cầu sẽ không được xác thực tự động nữa, nên việc đặt [Authorize]
các thuộc tính trên một số hành động sẽ dẫn đến việc các yêu cầu bị từ chối và HTTP 401
sẽ được cấp.
Vì đó không phải là những gì chúng tôi muốn vì chúng tôi muốn cung cấp cho các trình xử lý xác thực cơ hội xác thực yêu cầu, chúng tôi thay đổi chính sách mặc định của hệ thống ủy quyền bằng cách chỉ ra cả hai lược đồ xác thực Firebase
và Custom
nên được thử để xác thực yêu cầu.
Điều đó không ngăn cản bạn hạn chế hơn đối với một số hành động; các [Authorize]
thuộc tính có một AuthenticationSchemes
tài sản đó cho phép bạn ghi đè lên mà xác thực các chương trình có giá trị.
Nếu bạn có nhiều tình huống phức tạp hơn, bạn có thể sử dụng ủy quyền dựa trên chính sách . Tôi thấy tài liệu chính thức là tuyệt vời.
Hãy tưởng tượng một số hành động chỉ khả dụng đối với mã thông báo JWT do Firebase phát hành và phải có xác nhận quyền sở hữu với giá trị cụ thể; bạn có thể làm theo cách này:
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase")
.RequireClaim("role", "admin")
.Build());
});
Sau đó, bạn có thể sử dụng [Authorize(Policy = "FirebaseAdministrators")]
trên một số hành động.
Một điểm cuối cùng cần lưu ý: Nếu bạn đang nắm bắt AuthenticationFailed
các sự kiện và sử dụng bất kỳ thứ gì ngoại trừ AddJwtBearer
chính sách đầu tiên , bạn có thể thấy IDX10501: Signature validation failed. Unable to match key...
Điều này là do hệ thống kiểm tra từng AddJwtBearer
lượt một cho đến khi khớp. Lỗi này thường có thể được bỏ qua.