试图在我的所有控制器错误中未使用授权过滤器IAuthorizationHandler的错误

问题描述 投票:0回答:1

我试图定义一个授权策略,该策略将应用于所有控制器的所有方法。我正在尝试按照guidelines given here, in "Authorization for specific endpoints" subsection替换我以前的AuthorizeFilter,但它不起作用。

在我的Startup中,我有:

app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapDefaultControllerRoute().RequireAuthorization();
});

ConfigureServices中:

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
    .AddAzureADBearer(options => this.Configuration.Bind("AzureAd", options));

services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .AddRequirements(new MyRequirement(MyParams))
        .Build();
});
(...)
    services.AddTransient<IAuthorizationHandler, MyAuthorizationHandler>();

我有一个要求:

public class MyRequirement : IAuthorizationRequirement
{
    public EntityType MyParams { get; private set; }

    public MyRequirement(MyParams myParams) { MyParams = myParams; }
}

和处理程序:

public class MyAuthorizationHandler : AuthorizationHandler<MyRequirement>
{
    private readonly ILogger<MyAuthorizationHandler> logger;
    private readonly IHttpContextAccessor httpContextAccessor;

    public MyAuthorizationHandler(IHttpContextAccessor httpContextAccessor, ILogger<MyAuthorizationHandler> logger)
    {
        this.httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
        this.logger = logger;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
    {
---> Some things. I don't get here when I debug.       
    }
}

在我的控制器中,我不放置任何装饰器,因为我想将此授权策略应用于所有方法,所以这就是我覆盖DefaultPolicy的原因。>>

如果我调试,我不会像预期的那样在Handler处停止。实际上,如果我在控制器中放置装饰器[Authorize],我确实会停在那里,但是,正如我提到的那样,我试图避免在所有控制器中都编写此装饰器。

为什么不起作用?谢谢!

我试图定义一个授权策略,该策略将应用于所有控制器的所有方法。我正在尝试遵循此处给出的“特定端点的授权”小节中的指导,以……

c# asp.net-core .net-core .net-core-3.0
1个回答
1
投票

我的理解是,即使使用默认策略,也需要[Authorize]属性。当我需要以这种方式保护所有端点时,通常要做的是使用此属性创建一个抽象的基本控制器,然后让我的其他控制器从中继承。

© www.soinside.com 2019 - 2024. All rights reserved.