Я думаю, у вас есть пара вариантов. Если вы хотите использовать политики и вам нужно только контролировать доступ для каждого модуля, вы должны создать 3 политики и добавить одно или несколько утверждений к токену данного пользователя для проверки. Очевидно, что названия политик и утверждений зависят от вас:
services.AddAuthorization(options =>
{
options.AddPolicy("Analytics", policy => policy.RequireClaim("AllowAnalytics"));
options.AddPolicy("Search", policy => policy.RequireClaim("AllowSearch"));
options.AddPolicy("Admin", policy => policy.RequireClaim("AllowAdmin"));
});
Контроллер будет иметь атрибут auth, как вы указали ранее:
[Authorize(Policy = "Analytics")]
И вам придется добавить один из дополнительные утверждения (AllowAnalytics, AllowSearch, AllowAdmin) к токену JWT пользователя, когда он был выпущен. Этот метод довольно прост, но плохо масштабируется. Это хорошо только для трех областей, но если у вас гораздо больше модулей или вам нужно больше контроля, это не очень хорошо.
Если ваши пользователи могут быть аккуратно разделены на роли и действия разрешения могут быть легко сопоставлены с этими ролями, тогда вам лучше использовать эту опцию. Это можно сделать либо с помощью встроенных ASP. Net ролей идентификации ([Authorize (Roles = "Analytics, Admin")]), либо просто добавив утверждение "role" к токену JWT и используя политику RequireClaim, например приведенный выше пример.
Наконец, если у вас есть более сложные требования, например, у любого пользователя может быть произвольная комбинация разрешений (пользователю A нужны Analytics-View и Search-Search, но больше ничего), тогда вы, вероятно, захотите go с более сложным решением, которое включает в себя назначение c разрешений на доступ к каждому действию контроллера и сохранение пользовательской комбинации доступа в БД или чем-то еще. Посмотрите сообщения Джона П. Смита о его решении и его коде на GitHub, он довольно хорош: