Как создать собственную политику AuthorizeAttribute в ASP.NET Core? - PullRequest
0 голосов
/ 21 мая 2019

Я работаю над приложением для интрасети (вход в систему через AD), которому необходимо авторизовать права по отделам пользователей, названию или другим сведениям в AD.

В MS Docs кажется, что я должен использовать авторизацию на основе утверждений (https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims?view=aspnetcore-2.2).

Как вы можете изобразить, некоторая страница должна быть авторизована другим отделом, как я сказал по ссылке, я могу добавить несколько политик отдела, но это скучно, потому что у меня десятки отделов.

Что я могу сделать, чтобы реализовать это или что-то еще:

[Authorize(Policy = "Department" , Value = "Finance")]
[Authorize(Policy = "Title" , Value = "VP")]

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Вы ищете авторизацию на основе политики .

Политика состоит из одного или нескольких требований , которые можно определить с помощью интерфейса IAuthorizationRequirement. Затем вы создаете AuthorizationHandler<T>, где вы проверяете текущий контекст на соответствие заданному требованию. В вашем случае проверяется, является ли текущий пользователь частью необходимого отдела, указанного в атрибуте [Authorization]. Если вам нужен больший контроль или более конкретная логика авторизации, вы можете реализовать IAuthorizationHandler для одновременной обработки нескольких требований.

Я предлагаю вам взглянуть на документацию по реализации и регистрации политик с их требованиями и обработчиками.

0 голосов
/ 30 мая 2019

В дополнение к тому, что сказал Хенк, вы можете использовать внешнюю платформу, основанную на политике, такую ​​как или . Конечный результат похож на то, что написал Хенк, но он основан на политике, а не на коде (используя IAuthorizationRequirement).

Политика выглядит как старый английский.

policyset documents{
    target clause objectType == "document"
    apply firstApplicable
    policy employees{
        target clause user.role == "employee"
        apply firstApplicable
        /**
         * Employees can create documents in their own company
         */
         rule createDocument{
             target clause action.actionId=="create"
             condition user.company==resource.company
             permit
         }
         /**
          * Employees can delete documents they own
          */
        rule allowDelete{
            target clause action.actionId == "delete"
            condition user.userId == resource.owner
            permit
        }
    }
}

Затем вам нужно развернуть политику в своем механизме авторизации / точке принятия решения о политике, и вы вызываете ее из перехватчика в вашем приложении. Делая это таким образом, вы отделяете бизнес-логику (приложение) от логики авторизации (политики). Это также означает, что вы можете повторно использовать одни и те же политики / авторизацию в своих приложениях независимо от языка и стека (API, приложение, БД ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...