Как добавить политику авторизации с несколькими областями? - PullRequest
0 голосов
/ 04 марта 2020
options.AddPolicy("Account", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account"));
options.AddPolicy("AccountWrite", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account.write"));
options.AddPolicy("AccountRead", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account.read"));

Как добавить ИЛИ в область действия политики?

  • Политика "Учетная запись", если область действия - "учетная запись" (чтение, запись и удаление)
  • Политика «AccountWrite», если в качестве области используется «account» ИЛИ «account.write» (чтение и запись)
  • Политика «AccountRead», если в качестве области используется «account.read» (только чтение)

1 Ответ

1 голос
/ 04 марта 2020

Чтобы ответить на ваш вопрос, вы можете добавить несколько аргументов в оператор 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:

  1. Вы можете авторизовать клиента для доступа ко всему контроллеру, используйте область действия account в этом случае поверх контроллера.

  2. Вы можете авторизовать клиента для каждого метода, например 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.

Обратите внимание, что последняя часть не отвечает на ваш первоначальный вопрос, но может отвечать на вопросы, заданные в комментариях.

...