我试图定义一个授权策略,该策略将应用于所有控制器的所有方法。我正在尝试按照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]
,我确实会停在那里,但是,正如我提到的那样,我试图避免在所有控制器中都编写此装饰器。
为什么不起作用?谢谢!
我试图定义一个授权策略,该策略将应用于所有控制器的所有方法。我正在尝试遵循此处给出的“特定端点的授权”小节中的指导,以……
我的理解是,即使使用默认策略,也需要[Authorize]
属性。当我需要以这种方式保护所有端点时,通常要做的是使用此属性创建一个抽象的基本控制器,然后让我的其他控制器从中继承。