Trên hầu hết các API của tôi, tôi chỉ đơn giản là ủy quyền như thế này:
[Authorize(Policy = "Foo")]
public MyApi()
Tôi nhận được chính sách này từ NuGet và không thể sửa đổi nó.
Đối với một số API của tôi, tôi không muốn có chính sách này. Điều này cần phải được tìm ra trong thời gian chạy dựa trên một số cấu hình. Tôi muốn một số cách để chạy nội tuyến này và đảm bảo tất cả các trình xử lý được thiết lập chạy.
Sau rất nhiều lần tìm kiếm, tôi thấy rằng tôi đã tạo IAuthorizationService
và sử dụng nó để gọi AuthorizeAsync
. Điều này có vẻ như đó là những gì tôi muốn, nhưng vấn đề tôi đang gặp phải bây giờ là tất cả các trình xử lý đều dựa vào AuthorizationFilterContext
tài nguyên trên bối cảnh. Điều này dường như tự động xảy ra khi Ủy quyền được thực hiện thông qua thuộc tính, nhưng không thông qua lệnh gọi AuthorizeAsync. Nó cần phải được thông qua bằng tay trong trường hợp này. Mã của tôi bây giờ trông như thế này:
public MyApi()
{
var allowed = await _authorizationService.AuthorizeAsync(User, null, "Foo").ConfigureAwait(false);
}
Điều này dường như đi qua tất cả các trình xử lý của tôi một cách chính xác, nhưng chúng không hoạt động do thiếu AuthorizationFilterContext
.
1) Đây có phải là cách tiếp cận chính xác để bắt đầu, hoặc có một số cách khác để làm điều này nội tuyến? Tôi đoán có lẽ có một số cách để tạo chính sách của riêng mình bao bọc chính sách này và tôi có thể kiểm tra cấu hình ở đó, nhưng nếu có một cách tiếp cận nội tuyến đơn giản thì tôi thích điều đó hơn.
2) Nếu cách này là hợp lệ, có cách nào tốt để có được AuthorizationFilterContext
không? Tôi đã thử tạo nó bằng tay, nhưng tôi sợ điều này không thực sự chính xác mà không truyền thêm dữ liệu từ ngữ cảnh, nhưng tôi không thể tìm thấy bất kỳ ví dụ / tài liệu hay nào:
new AuthorizationFilterContext(new ActionContext(HttpContext, HttpContext.GetRouteData(), new ActionDescriptor()), new IFilterMetadata[] { });