Чтобы ответить на ваш вопрос, вы можете добавить несколько аргументов в оператор RequireClaim. Как задокументировано :
RequireClaim (String, String [])
претензия-тип String
Требуемый тип заявки.
allowValues IEnumerable
Значения, которые претензия должна обработать одно или несколько of для оценки успеха.
В вашем случае что-то вроде:
options.AddPolicy("Account", policy =>
policy.RequireClaim(JwtClaimTypes.Scope, "account", "account.read", "account.write", "account.delete"));
options.AddPolicy("AccountWrite", policy =>
policy.RequireClaim(JwtClaimTypes.Scope, "account", "account.write"));
options.AddPolicy("AccountRead", policy =>
policy.RequireClaim(JwtClaimTypes.Scope, "account", "account.read"));
Но это немного странно для областей.
Наличие области означает, что клиент авторизован для доступа к ресурсу, независимо от того, какой пользователь использует клиент.
Область обозначает часть ресурса, которая выполняет определенную задачу c другими словами, имеет определенные функции.
Предполагается, что CRUD AccountController:
Вы можете авторизовать клиента для доступа ко всему контроллеру, используйте область действия account
в этом случае поверх контроллера.
Вы можете авторизовать клиента для каждого метода, например account.read
Индекс метод, account.write
Создание и Обновление методов и account.delete
Удаление метод. Маловероятно, что области могут быть смешаны из-за различий в функциональности.
Оба могут быть хорошими, потому что это пользователь , который должен быть авторизован для использования ресурс. Клиент доставляет пользователя к ресурсу и выполняет запрос от имени пользователя. Но нет смысла совмещать оба.
Какой дизайн вам подойдет?
Предположим, у вас есть приложение администратора, где пользователю разрешено управлять учетной записью. Клиент имеет собственное приложение и хочет получить доступ к ресурсу с помощью этого приложения, но вы не хотите разрешать полное управление из этого приложения.
В этом случае приложение client из Клиенту должно быть разрешено запрашивать только объем account.read
. Потому что, если пользователю разрешено управлять учетной записью, вы должны убедиться, что это возможно только с помощью вашего приложения.
Таким образом, вы можете «нормализовать» политики.
Для 1 .
options.AddPolicy("Account", policy =>
policy.RequireClaim(JwtClaimTypes.Scope, "account"));
и для 2.
options.AddPolicy("AccountDelete", policy =>
policy.RequireClaim(JwtClaimTypes.Scope, "account.delete"));
options.AddPolicy("AccountWrite", policy =>
policy.RequireClaim(JwtClaimTypes.Scope, "account.write"));
options.AddPolicy("AccountRead", policy =>
policy.RequireClaim(JwtClaimTypes.Scope, "account.read"));
Если подумать, на основе клиентского приложения, как упомянуто выше, существует третий вариант:
Вы можете авторизовать клиент
для каждого метода, например,
AccountRead
метод
Index и
Account
для других методов. Где
AccountRead
должен включать в себя область учетной записи.
Политики будут выглядеть следующим образом:
// policy to allow client access to write and delete functionality
options.AddPolicy("Account", policy =>
policy.RequireClaim(JwtClaimTypes.Scope, "account"));
// policy to allow client access to read functionality only
options.AddPolicy("AccountRead", policy =>
policy.RequireClaim(JwtClaimTypes.Scope, "account", "account.read"));
Приложение администратора должно запрашивать только область account
, тогда как клиентское приложение может запросить область действия account.read
.
Обратите внимание, что последняя часть не отвечает на ваш первоначальный вопрос, но может отвечать на вопросы, заданные в комментариях.