Как добавить глобальный "AuthorizeFilter" или "AuthorizeAttribute" в ASP.NET Core?

В ASP.NET MVC 4 и ниже мы просто добавляем следующее в Global.asax:

GlobalFilters.Filters.Add(new AuthorizeAttribute() { Roles = "Admin, SuperUser" });

Любая идея, как это сделать в ASP.NET Core MVC?

Ответ 1

От docs:

Вы можете зарегистрировать фильтр по всему миру (для всех контроллеров и действий) добавив его в коллекцию MvcOptions.Filters в ConfigureServices в классе Startup:

Вы не можете добавить AuthorizeAttribute в MvcOptions.Filters. Создайте AuthorizationPolicy и используйте AuthorizeFilter:

var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .RequireRole("Admin", "SuperUser")
        .Build();

services.AddMvc(options =>
{
    options.Filters.Add(new AuthorizeFilter(policy));
});

Ответ 2

Вы также можете использовать приведенный ниже код. Это использует тип, а не экземпляр.

services.AddMvc(options =>
{
    options.Filters.Add(typeof(AuthorizeFilter));
});

И используя Dependency Injection вы можете разрешить объект политики.

Ответ 3

Если вы используете Razor Page flavor из ASP.NET Core 2.0, вы можете добавить глобальные фильтры следующим образом:

services.AddMvc()
.AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizeFolder("/"); // Require users to be authenticated.
            options.Conventions.AuthorizeFolder("/", "YourPolicyName"); // Require a policy to be full filled globally.
        });