将带有策略的授权应用于 asp.net core 中命名空间内的所有控制器

Ror*_*ory 2 asp.net authorization asp.net-authorization asp.net-core asp.net-core-webapi

使用 ASP.NET 5,我实现了一个授权策略,我希望将其应用于命名空间中的所有控制器,但不适用于项目中的所有控制器。[Authorize(Policy="MyPolicy")]除了分别向每个控制器添加属性之外,还有其他方法可以做到这一点吗?我想避免另一个开发人员向命名空间添加新控制器但忘记应用策略的风险。

手动执行时看起来像这样:

[ApiController]
[Authorize(Policy="MyPolicy")]
[Route("api/DoStuff")]
public class MyController : ControllerBase
{ 

    [HttpGet("foo")]
    public GetFoo() 
    {
    }

}
Run Code Online (Sandbox Code Playgroud)

小智 6

您可以实现 IControllerModelConvention 并根据控制器的命名空间管理策略

AddAuthorizeFiltersControllerConvention.cs

public class AddAuthorizeFiltersControllerConvention : IControllerModelConvention
{
    public void Apply(ControllerModel controller)
    {
        if (controller.ControllerType.Namespace == "My.Admin.Namespace")
        {
            controller.Filters.Add(new AuthorizeFilter("AdminPolicy"));
        }
        else 
        {
            controller.Filters.Add(new AuthorizeFilter("DefaultPolicy"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以将此控制器模型约定应用于ConfigureServices中的控制器

启动.cs

public void ConfigureServices(IServiceCollection services)
{
    // ... Cutting everything else in the ConfigureServices for simplicity

    services.AddControllers(options => {
        options.Conventions.Add(new AddAuthorizeFiltersControllerConvention());
    });
}
Run Code Online (Sandbox Code Playgroud)

另一个例子可以在这里找到http://hpblogs.com/blogs/add-authorize-policy-dynamically-to-all-controllers-in-asp-net-core-3-1/48