web-dev-qa-db-ja.com

AuthorizationHandlerContextを使用してASP.NET Core 2カスタムポリシーベースの承認で現在のHttpContextにアクセスする方法

現在のHttpContextにアクセスして、ASP.NET Core 2内のカスタムポリシーベースの承認のAuthorizationHandlerContext内のルートとパラメーターを確認するにはどうすればよいですか?

参照例: カスタムポリシーベースの承認

16
Hrvoje Kusulja

IHttpContextAccessor のインスタンスをAuthorizationHandlerに挿入する必要があります。

example のコンテキストでは、これは次のようになります。

public class BadgeEntryHandler : AuthorizationHandler<EnterBuildingRequirement>
{
    IHttpContextAccessor _httpContextAccessor = null;

    public BadgeEntryHandler(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    protected override Task HandleRequirementAsync(
        AuthorizationContext context, 
        EnterBuildingRequirement requirement)
    {
        HttpContext httpContext = _httpContextAccessor.HttpContext; // Access context here

        if (context.User.HasClaim(c => c.Type == ClaimTypes.BadgeId &&
                                       c.Issuer == "http://microsoftsecurity"))
        {
            context.Succeed(requirement);
            return Task.FromResult(0);
        }
    }
}

次のように、DIセットアップでこれを登録する必要がある場合があります(依存関係の1つがまだない場合)。

services.AddHttpContextAccessor();
42
CalC

IHttpContextAccessorAuthorizationHandlersコンストラクターに注入できます。

例えば.

public class MyAuthorizationHandler : AuthorizationHandler<MyRequirement>
{
    private IHttpContextAccessor _contextAccessor;

    public MyAuthorizationHandler (IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
        MinimumPermissionLevelRequirement requirement) {

        var httpContext = _contextAccessor.HttpContext;
        // do things
    }
}
4
JamesT

注射せずに、簡単な解決策!

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
        {
                var authFilterCtx = (Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
                var httpContext = authFilterCtx.HttpContext;  
        }
1
Mohsin