Настройка политик JWT с утверждениями в. NET Core 3.1? - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь настроить свой проект с промежуточным ПО авторизации, используя JWT.

Вот сценарий, например,

У меня есть 3 модуля

  1. Аналитика

    • Поиск
    • Просмотр
    • Сохранить
  2. Поиск

    • Поиск
    • Просмотр
    • Сохранить
  3. Администратор

    • Только администраторы

Из моего понимания, основанного на нескольких блоги Мне нужно установить промежуточное ПО с Policy, которое будет представлять мою функциональность Analytics, Search, Admin. Затем я украшаю контроллер с [Authorize(Policy="Analytics")], и JWT авторизуется против этой Analytics политики.

Вопрос:

Если моя политика имеет несколько функций, таких как Search = 1, View = 2, Save = 3, где Save имеет доступ к View и Search, как это сделать? Я настраиваю заявку для этой политики и передаю информацию в атрибут Authorize?

 services.AddAuthorization((options) =>
            {
                options.AddPolicy("Analytics", policy =>
                {
                    policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
                    ???
                    ???
                    ???
                });
            });

[Authorize(Policy = "Analytics")]

1 Ответ

1 голос
/ 15 января 2020

Я думаю, у вас есть пара вариантов. Если вы хотите использовать политики и вам нужно только контролировать доступ для каждого модуля, вы должны создать 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, он довольно хорош:

...