Авторизовать контроллер ASP.NET Core 2.1 сразу с несколькими схемами

Предположим, что мы используем аутентификацию со схемой «Abc» и соответствующим обработчиком, и все отлично. Мы можем защитить контроллер просто с помощью

[Authorize(AuthenticationSchemes = "Abc", Roles = "admin")] атрибут

Но теперь появилась необходимость иметь возможность защищать конечные точки контроллера и с помощью схемы "Xyz" (поэтому запрос должен соответствовать требованиям обех схем). Итак, я подумал, что регистрации новой схемы и обработчика достаточно, чтобы иметь возможность использовать [Authorize] следующим образом и получать логику AND:

[Authorize(AuthenticationSchemes = "Abc", Roles = "admin")]
[Authorize(AuthenticationSchemes = "Xyz")]
public class UserController : ControllerBase 
{
}

Но вместо этого действительный запрос к контроллеру приводит к статусу ответа "Запрещено" (обратите внимание, что даже не в "Неавторизовано").

Также мне интересно, что когда мы применяем [Authorize(AuthenticationSchemes = "Xyz")] к методу действия вместо контроллера - все работает как надо.

P.S: MvcOptions.AllowCombiningAuthorizeFilters в Startup уже установлено на false.

Я предполагаю, что он все еще каким-то образом объединяет логику авторизации, когда оба атрибута присутствуют на одном уровне (в данном случае контроллера).

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


person Andrew Kibalnikov    schedule 20.09.2018    source источник


Ответы (1)


Я думаю, что на этот вопрос можно было ответить здесь.

Когда вы видите сложные атрибуты авторизации, как в этом случае, авторизация на основе политик может помочь сохранить удобство и простоту обслуживания.

То, что вы получите в результате использования политик, выглядит примерно так:

services.AddAuthorization(options =>
{
    options.AddPolicy("MyPolicy", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireRole("Admin");
        policy.AddAuthenticationSchemes("Abc", "Xyz");
    });
});

и вы бы украсили либо свой контроллер, либо любой из его методов не чем иным, как

[Authorize(Policy = "MyPolicy")]

Ознакомьтесь с официальной документацией а также узнать, как это делается и что он может вам предложить.

person Wim Ombelets    schedule 25.09.2018