Авторизовать контроллер ASP.NET Core 2.1 одновременно несколькими схемами - PullRequest
0 голосов
/ 20 сентября 2018

Предположим, что мы используем аутентификацию со схемой "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 Ответ

0 голосов
/ 25 сентября 2018

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

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

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

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

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

[Authorize(Policy = "MyPolicy")]

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

...