Авторизовать контроллер 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")] по методу действия вместо контроллера - все работает как надо.

PS: MvcOptions.AllowCombiningAuthorizeFilters в Startup уже настроен на false,

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

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

1 ответ

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

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

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

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

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

[Authorize(Policy = "MyPolicy")]

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

Другие вопросы по тегам