В моей программе я хочу
- Проверить, зарегистрированы ли пользователи в таблице определенных пользователей для всех возможных действий.
- Только для определенных действий, Я также хочу проверить, есть ли у пользователя соответствующие права CRUD.
Я проверяю 1-е условие в startup
с помощью следующего кода:
services.AddAuthorization(options =>
{
// This policy checks if a user is registered in our Users table.
options.AddPolicy(
"UserIsRegistered",
new AuthorizationPolicyBuilder()
.AddRequirements(new RegistrationRequirement())
.Build());
});
Я также добавляю
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers().RequireAuthorization("UserIsRegistered");
});
и определяю RegistrationRequirement
и RegistrationAuthorizationHandler
соответственно.
Для 2-го условия я создал атрибут CrudAuthorizeAttribute
со своим CrudAuthorizationHandler
. Поскольку для каждого возможного действия Crud у меня есть одна отдельная полиция, я создал CrudPolicyProvider
.
Затем я зарегистрировал все в Startup
:
services.AddTransient<IAuthorizationHandler, RegistrationAuthorizationHandler>();
services.AddTransient<IAuthorizationHandler, CrudAuthorizationHandler>();
services.AddTransient<IAuthorizationPolicyProvider, CrudPolicyProvider>();
Теперь я вижу, когда я проверяю 1-е условие Я получаю политику от CrudPolicyProvider
, но я ожидаю, что этот генератор политик будет предоставлять политики только во 2-м условии.
Поэтому:
- Есть ли способ укажите, что
CrudPolicyProvider
должен использоваться только с CrudAttribute
и больше нигде? - В более общем смысле, можно ли определить двух поставщиков политики (как я могу сделать с
IAuthorizationHandler
)
services.AddTransient<IAuthorizationPolicyProvider, FirstPolicyProvider>();
services.AddTransient<IAuthorizationPolicyProvider, SecondPolicyProvider>();
и использовать каждый из них только при необходимости?
- Если ответ нет , значит ли это, что я должен определить один
GeneralPolicyProvider
и внутри этот провайдер проверяет, какие политики я должен предоставлять каждый раз в зависимости от ситуации? (что-то вроде использования POLICY_PREFIX
здесь ?).
Спасибо!