Авторизовать контроллер 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")]
Посмотрите также на официальные документы, чтобы узнать, как это делается и что он может вам предложить.