Атрибут c # .Net Core 2.1 Authorize - утверждения по умолчанию - PullRequest
1 голос
/ 01 октября 2019

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

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

Еще один способ задать вопрос: возможно ли добавить заявку в политику по умолчанию?

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

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

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

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

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

public class AuthorizePolicyAttribute : AuthorizeAttribute
{
    public AuthorizePolicyAttribute()
    {
        Policy = "CustomPolicy";
    }
}
1 голос
/ 01 октября 2019

Во избежание ложноположительной ошибки (т. Е. Вы забыли поместить атрибут [Authorize] в один из ваших сотен методов действий или контроллеров, а опытный хакер каким-то образом достиг этой конечной точки), вы также можете добавить соглашение к своим контроллерамтак что они автоматически имеют атрибут [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 ());
    });
}
...