Исходя из того, что вы сказали, например:
[...], но его трудно поддерживать, он очень специфичен для класса, с которым я работаю, и требуеткод, который будет компилироваться каждый раз при изменении разрешений (что часто происходит)
Похоже, вам нужен способ для экстернализации вашей авторизации из приложения, для которого именно предназначен контроль доступа на основе атрибутов.Итак, вы на правильном пути!:-)
Прежде всего, полное раскрытие, я работаю в Axiomatics , компании, которая предоставляет решения по управлению доступом на основе атрибутов, которые иногда называют динамической авторизацией.Тем не менее, я постараюсь рассказать вам, как добиться того, что вам нужно, и это будет зависеть от поставщика.
Краткий обзор управления доступом на основе атрибутов и расширяемого языка разметки управления доступом
Расширяемый язык разметки управления доступом - это язык, основанный на стандартахдля атрибутного контроля доступа.Он определяет архитектуру и модель обработки, описывающую, как оценивать запросы доступа.
Архитектура содержит следующие компоненты:
Policy Enforcement Point (PEP): это компонент, который защищает API / приложение, которое вы хотите защитить.PEP перехватывает поток, анализирует его и отправляет запрос авторизации в PDP (см. Ниже).Затем он получает решение (Permit / Deny), которое он применяет.
Точка принятия решения о политике (PDP) получает запрос на авторизацию (например, может ли Алиса просмотреть запись # 123?) И оценивает его по набору политикбыл настроен с.В конечном итоге он принимает решение, которое отправляет обратно в PEP.В процессе оценки PDP могут потребоваться дополнительные метаданные, например, должность пользователя.Для этого он может обратиться к информационным точкам политики (PIP)
Информационная точка политики (PIP) - это интерфейс между PDP и базовыми источниками данных, например, LDAP, базой данных, службой REST, содержащей метаданные.о пользователях, ресурсах или другом.Вы можете использовать PIP для получения информации, которая может понадобиться PDP во время выполнения, например, оценка риска, местоположение записи или др.
Рассматривать ваше приложение как точку исполнения
Для повышения эффективности управления авторизацией, как уже упоминалось, нам необходимо решение, которое обрабатывает принятие решений извне из логики приложения запрашивающего приложения.Запрашивающее приложение обычно известно как точка применения политики, поскольку в этот момент политика авторизации применяется (имеет смысл, верно?).
Итак, в вашем приложении вам понадобятся методы для связи с внешним сервером авторизации.Например, вы можете вызвать метод для одобрения заказа на покупку, который выглядит следующим образом:
XacmlAuthorizationDecision d = PDPUtil.PurchaseOrderAuthorization(User.Identity.Name, "approve",
po.Identifier.ToString(), "purchase order",Request);
Содержимое этого метода должно добавить необходимые атрибуты запрашивающей стороны (субъекта - то есть, что является работой пользователяназвание, отдел, обучение, которое дает ему или ей доступ), а также любые атрибуты, касающиеся ресурса.Атрибуты, относящиеся к ресурсу, могут быть такими же простыми, как и идентификатор ресурса (т. Е. Идентификатор ресурса = 12345).
Можно сделать больше для реализации еще более точного управления доступом к зерну с помощью атрибутов среды, таких как время суток.
За кулисами, в содержимом метода, который вы вызываете, конечно, должен быть, конечно, HTTP к вашему серверу принятия решений (так называемая точка принятия решения о политике).Атрибуты в запросе, который мы только что обсудили, передаются в эту точку принятия решения о политике.
Лицо, принимающее решение - Точка принятия решения о политике (PDP)
Точка принятия решения о политикепредоставляет решение, за которое отвечает точка реализации политики (PEP).
Язык XACML имеет ответ, основанный на стандартах, для обеспечения совместимости и общей терминологии.Это означает, приобретаете ли вы продукт ABAC (например, Axiomatics) или пишете свое собственное программное обеспечение ABAC, если вы следуете стандарту, программное обеспечение может быть заменено без ущерба для вашего разрешения.
Пример ответа в JSON от механизма XACML выглядит следующим образом:
{
"Response" : {
"Decision" : "Permit",
"Status" : {
"StatusCode" : {
"Value" : "urn:oasis:names:tc:xacml:1.0:status:ok"
}
}
}
}
Пример ответа при использовании SOAP выглядит следующим образом:
<xacml-ctx:Response xmlns:xacml-ctx="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
<xacml-ctx:Result>
<xacml-ctx:Decision>Deny</xacml-ctx:Decision>
<xacml-ctx:Status>
<xacml-ctx:StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:ok"/>
</xacml-ctx:Status>
</xacml-ctx:Result>
</xacml-ctx:Response>
Ваш PEPполучит этот ответ, и для его обработки потребуется логика приложения.Например, в DENY вы можете отказаться от отображения определенных компонентов пользовательского интерфейса.В разрешении вы должны показать компоненты пользовательского интерфейса.Вы можете легко принимать эти решения для веб-страниц, не влияя на производительность.
Если вы планируете приобрести продукт ABAC, а не создавать свой собственный, обязательно проверьте, какие профили XACML поддерживаются.Не все профили (например, JSON или множественные решения) поддерживаются всеми поставщиками.
Наконец, небольшой плагин для Axiomatics - мы полностью совместимы с XACML и имеем .NET SDK.
Если у вас есть какие-либо вопросы о том, что я освещал, пожалуйста, дайте мне знать.