Применить фильтр авторизации на всех контроллерах в области - PullRequest
0 голосов
/ 30 ноября 2018

Как я могу форсировать авторизацию на всех контроллерах в области?В частности, я хотел бы настроить AuthorizeFilter для применения к области 'admin' как часть метода Startup.ConfigureServices().

1 Ответ

0 голосов
/ 30 ноября 2018

Один из способов сделать это с использованием пользовательского IControllerModelConvention

public class AuthorizeAreaConvention : IControllerModelConvention
{
    private readonly string _area;
    private readonly string _policy;

    public AuthorizeAreaConvention(string area, string policy)
    {
        _area = area;
        _policy = policy;
    }

    public void Apply(ControllerModel controller)
    {
        if (controller.Attributes.Any(a => 
                a is AreaAttribute && (a as AreaAttribute).RouteValue.Equals(_area, StringComparison.OrdinalIgnoreCase))
            || controller.RouteValues.Any(r =>
                r.Key.Equals("area", StringComparison.OrdinalIgnoreCase) && r.Value.Equals(_area, StringComparison.OrdinalIgnoreCase)))
        {
            controller.Filters.Add(new AuthorizeFilter(_policy));
        }
    }
}

Затем в вашем методе Startup.ConfigureServices() вы можете добавить:

services.AddMvc(options =>
{
    options.Conventions.Add(
            new AuthorizeAreaConvention("Admin", Policy.AdministratorPolicy));
});

Где Policy.AdministratorPolicy это просто строковая константа (например, "AdministratorPolicy"), которая зарегистрирована в приложении StartUp следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(o =>
    {
        o.AddPolicy(Policy.AdministratorPolicy, b =>
        {
            b.RequireAuthenticatedUser();
            b.RequireClaim(ClaimTypes.Role, Roles.Admin);
        });
    });

    // Add framework services.
    services.AddMvc();
    // ... Omitted for brevity
}

В приведенном выше примере Roles.Admin это простостроковая константа (например, "Admin").

...