netcore api 3.1에서 AuthorizationFilterContext 읽기


9

API 키를 확인하는 사용자 지정 정책을 구현 한 netcore 2.2 프로젝트가 진행 중입니다.

startup.cs에서 다음과 같은 정책을 추가하고 있습니다

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

내 AppKeyRequirement에서 AuthorizationHandler에서 상속하고 다음과 같이 들어오는 요청의 키를 확인합니다.

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

netcore 3.1에서는 작동하지 않습니다

다음과 같은 오류가 발생합니다.

'Microsoft.AspNetCore.Routing.RouteEndpoint'유형의 개체를 'Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext'유형으로 캐스트 할 수 없습니다.

코어 3 이상에서이를 수행하는 올바른 방법은 무엇입니까?

Kirk Larkin이 지적한 바와 같이 .net 3.0 이상에서 올바른 방법은 IHttpContextAccessor를 Auth 핸들러에 주입하여 사용하는 것입니다.

이 시점에서 내 질문은 어떻게 주입합니까? startup.cs에서 이것을 전달할 수 없거나 적어도 어떻게 보지 못합니다.

모든 아이디어 / 힌트는 대단히 감사하겠습니다.

답변:


14

ASP.NET Core 3.0 이전 버전에서는 IAuthorizationHandlerMVC 파이프 라인 에서 구현 이 호출되었습니다. 엔드 포인트 라우팅 (기본적으로)을 사용하는 3.0 이상에서는 이러한 구현이 권한 미들웨어 ( UseAuthorization())에 의해 호출됩니다 . 이 미들웨어는 MVC 파이프 라인의 일부가 아니라 MVC 파이프 라인보다 먼저 실행됩니다 .

이 변경 AuthorizationFilterContext은 더 이상 권한 부여 핸들러로 전달되지 않음을 의미합니다 . 대신에의 RouteEndpoint액세스를 제공하지 않는 의 인스턴스입니다 HttpContext.

귀하의 예에서는 만 사용 AuthorizationFilterContext하고 있습니다 HttpContext. 3.0 이상에서는 IHttpContextAccessor권한 부여 핸들러에 주입 하여 사용하십시오. 완전성에 대한 예는 다음과 같습니다.

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"))
        {
            // ...
        }
    }
}

또한 등록해야 할 수도 있습니다 IHttpContextAccessorConfigureServices:

services.AddHttpContextAccessor();

사용에 대한 자세한 내용은 사용자 지정 구성 요소에서 HttpContext 사용을 참조 하십시오IHttpContextAccessor .


1
이 힌트에 감사드립니다. API 키가 없으면 호출이 거부되는 정책을 만들려고합니다. 더 이상 // 키 정책 추가 서비스를 사용할 수 없습니까? 그렇지 않은 경우 컨트롤러 동작에 도달하기 전에 어떻게 전화를 가로 챌 수 있습니까?
w2olves

1
예, 여전히 이전과 동일하게 작동합니다.
Kirk Larkin

생성자는 IHttpContextAccessor를 기대하고 있습니다. Startup.cs에서 정책을 만들 때 어떻게 전달할 수 있습니까? services.AddAuthorization (options => {options.AddPolicy ( "AppKey", policy => policy.Requirements.Add (new AppKeyRequirement ()));}); AppKeyAuthorizationHandler에 대한 새 기본 생성자를 생성 한 다음 httpContextAccessor.HttpContext를 생성 할 수도 있습니다. 요청이 들어 오면 null입니다. 어떤 아이디어?
w2olves

1
DI를 사용하여 처리기를 추가하면 인스턴스가 만들어지고를 전달합니다 IHttpContextAccessor. 문서를 참조하십시오 .
Kirk Larkin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.