Đọc AuthorizationFilterContext trong netcore api 3.1


9

Tôi có một dự án netcore 2.2 đang hoạt động, nơi tôi đã thực hiện chính sách tùy chỉnh để kiểm tra Khóa API.

Trong startup.cs tôi đang thêm chính sách này như thế này

//Add Key Policy
services.AddAuthorization(options =>
{
    options.AddPolicy("AppKey", policy => policy.Requirements.Add(new AppKeyRequirement()));
});

Trong AppKeyRequonth của tôi, tôi thừa hưởng từ AuthorizationHandler và giải quyết các khóa trong các yêu cầu đến như thế này

protected override Task HandleRequirementAsync(AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
{
    var authorizationFilterContext = (AuthorizationFilterContext)authContext.Resource;
    var query = authorizationFilterContext.HttpContext.Request.Query;

    if (query.ContainsKey("key") && query.ContainsKey("app"))
    { // Do stuff

Điều này không hoạt động trong netcore 3.1

Tôi nhận được lỗi sau:

Không thể truyền đối tượng loại 'Microsoft.AspNetCore.Routing.RouteEndpoint' để nhập 'Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext'.

Cách chính xác để làm điều này trong lõi 3 trở lên là gì?

Như Kirk Larkin đã chỉ ra, cách chính xác trong .net 3.0 trở lên là tiêm IHttpContextAccessor vào trình xử lý Auth và sử dụng nó.

Câu hỏi của tôi tại thời điểm này là làm thế nào để tôi tiêm này? Tôi không thể vượt qua điều này trong startup.cs hoặc ít nhất là tôi không thấy làm thế nào.

Bất kỳ ý tưởng / gợi ý sẽ được nhiều đánh giá cao.

Câu trả lời:


14

Trong các phiên bản trước ASP.NET Core 3.0, việc triển khai IAuthorizationHandlerđã được gọi trong đường dẫn MVC. Trong 3.0 trở đi, sử dụng định tuyến điểm cuối (theo mặc định), các triển khai này được gọi bởi phần mềm trung gian ủy quyền ( UseAuthorization()). Phần mềm trung gian này chạy trước đường ống dẫn MVC, chứ không phải là một phần của nó.

Thay đổi này có nghĩa AuthorizationFilterContextlà không còn được chuyển cho người xử lý ủy quyền. Thay vào đó, đây là một ví dụ RouteEndpoint, không cung cấp quyền truy cập vào HttpContext.

Trong ví dụ của bạn, bạn chỉ sử dụng AuthorizationFilterContextđể nắm bắt HttpContext. Trong 3.0+, tiêm IHttpContextAccessorvào trình xử lý ủy quyền của bạn và sử dụng nó. Đây là một ví dụ cho sự hoàn chỉnh:

public class AppKeyAuthorizationHandler : AuthorizationHandler<AppKeyRequirement>
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public AppKeyAuthorizationHandler(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
    {
        var httpContext = httpContextAccessor.HttpContext;
        var query = httpContext.Request.Query;

        if (query.ContainsKey("key") && query.ContainsKey("app"))
        {
            // ...
        }
    }
}

Bạn cũng có thể cần phải đăng ký IHttpContextAccessortại ConfigureServices:

services.AddHttpContextAccessor();

Xem Sử dụng HttpContext từ các thành phần tùy chỉnh để biết thêm thông tin về cách sử dụng IHttpContextAccessor.


1
Cảm ơn bạn cho gợi ý này. Tôi đang cố gắng tạo một chính sách trong đó nếu khóa API bị thiếu thì cuộc gọi sẽ bị từ chối. Chúng tôi không còn có thể sử dụng // Thêm dịch vụ chính sách chính.AddAuthorization (tùy chọn => {tùy chọn.AddPolicy ("AppKey", chính sách => chính sách.Requirements.Add (mới AppKeyRequonth ()));}); Nếu không, làm thế nào tôi có thể chặn cuộc gọi trước khi nó thực hiện hành động điều khiển?
w2olves

1
Vâng, điều đó vẫn hoạt động giống như trước đây.
Kirk Larkin

Hàm tạo đang mong đợi IHttpContextAccessor làm thế nào tôi có thể vượt qua điều này khi tôi tạo chính sách trong Startup.cs? services.AddAuthorization (Tùy chọn => {tùy chọn.AddPolicy ("AppKey", chính sách => chính sách.Requirements.Add (new AppKeyRequftime ()));}); Tôi cũng có thể tạo một hàm tạo mặc định mới cho AppKeyAuthorizationHandler nhưng sau đó httpContextAccessor.HttpContext; là null khi có yêu cầu đến. Có ý tưởng nào không?
w2olves

1
Bạn thêm trình xử lý của mình bằng DI, nó tạo một thể hiện của nó cho bạn và truyền vào IHttpContextAccessor. Xem tài liệu .
Kirk Larkin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.