Атрибут авторизации c # .Net Core 2.1 - утверждения по умолчанию

При использовании атрибута [Authorize] (без указания политики) есть ли способ установить обязательное утверждение для политики по умолчанию?

Дело в том, что я хотел бы, чтобы запрос на авторизацию требовал, но я не хочу, чтобы мне явно приходилось устанавливать политику для контроллеров. Я бы предпочел просто [Авторизовать], а не [Авторизовать (Policy = "something")]

Другой способ задать вопрос: можно ли добавить претензию к политике по умолчанию?

Заранее благодарим за любые идеи и мнения.


person amd3    schedule 01.10.2019    source источник


Ответы (2)


Вы можете переопределить политику по умолчанию при запуске

services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
                                      .RequireClaim("CLAIM")
                                      .Build();
});

Также, если вы хотите авторизоваться с помощью какой-либо настраиваемой политики и избегать многократного написания политики, вы можете создать новый атрибут авторизации.

public class AuthorizePolicyAttribute : AuthorizeAttribute
{
    public AuthorizePolicyAttribute()
    {
        Policy = "CustomPolicy";
    }
}
person Kahbazi    schedule 01.10.2019

Чтобы предотвратить ложноположительную ошибку (например, вы забыли поместить атрибут [Authorize] в один из сотен ваших методов или контроллеров действий, и опытный хакер каким-то образом достиг этой конечной точки), вы также можете добавить соглашение к своим контроллерам, чтобы они автоматически имеют атрибут [Авторизовать]. Если вам действительно не нужна авторизация для какого-либо метода действия или контроллера, вы можете использовать для него атрибут [AllowAnonymous].

Сначала вам нужно создать новую политику авторизации и добавить ее к своим службам в своем классе Startup.cs в методе ConfigureServices:

services.AddAuthorization(o => {    
    o.AddPolicy("authwithsomepolicy", p =>
    {
        p.RequireAuthenticatedUser();
        p.RequireClaim("MYPOLICY");
    }); 
});

Затем вы создаете новый класс, который расширяет IControllerModelConvention и выполняет автоматизацию этой политики для всех ваших контроллеров:

public class AddAuthorizeFilters : IControllerModelConvention
{
    public void Apply(ControllerModel controller)
    {
        controller.Filters.Add(new AuthorizeFilter("authwithsomepolicy"));            
    }
}

И, наконец, в своем классе Startup.cs вы можете добавить это соглашение в свою систему Mvc (снова в методе ConfigureServices):

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(setupAction =>
    {
        setupAction.Conventions.Add(new AddAuthorizeFilters ());
    });
}
person ali kerim erkan    schedule 01.10.2019