Авторизация элементов управления пользовательского интерфейса на основе нескольких факторов (роль пользователя, местоположение и т. Д.) - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть рабочий процесс, в котором я отправляю объект (в данном случае Заказ) через несколько отделов (мест).

Одна и та же форма используется для каждой стадии процесса, но различные элементы пользовательского интерфейсавключено или сделано видимым по определенным критериям:

  • Роль пользователя (имеет ли пользователь права на выполнение этого действия)
  • Местоположение (можно ли изменить это поле, когда объект находится в этомlocation)
  • Другие факторы (был ли этот объект изначально создан этим пользователем, был ли он изменен и т. д.)

В настоящее время мой метод довольно прост, но его трудно поддерживать,очень специфичен для класса, с которым я работаю, и требует, чтобы код компилировался при каждом изменении разрешений (что часто):

Код класса:

Public Class Order

    Public ReadOnly Property CanEditHeader
        If Me.Location = "Sales" AndAlso Me.UserRole = "Salesman" AndAlso Me.CreatorID = Me.UserID AndAlso Me.Revision = 0 Then
            Return True
        Else
            Return False
        End If
    End Property

    ...

End Class

Код пользовательского интерфейса:

Public Class OrderUI

    Public ThisOrder As Order        

    Public Sub UpdateUI()

        If ThisOrder.CanEditHeader Then
            Me.HeaderPanel.Enabled = True
        End If
        ...
    End Sub

    ...

End Class

Это похоже на этот код слишком явный для этого класса и может стать очень многословным при добавлении более сложных разрешений:

Public ReadOnly Property CanEditHeader
    If Me.UserRole = "SuperUser" Then
        Return True
    ElseIf Me.OrderType = "SalesOrder" AndAlso Me.UserRole = "Salesman" AndAlso Me.CreatorID = Me.UserID AndAlso Me.Revision = 0 Then
        Return True
    ElseIf Me.OrderType = "DevelopmentOrder" AndAlso Me.UserRole = "Developer" AndAlso Me.CreatorID = Me.UserID AndAlso Me.Revision = 0 Then
        Return True
    Else
        Return False
    End If
End Property

ВклЯ думал, что должен был дать разрешения как Пользователю, так и Классу, и разрешить, где они пересекаются, но это не выглядит намного лучше, и теперь я должен сохранить свои разрешения в двух местах:

If ThisUser.CanEditHeader AndAlso ThisOrder.CanEditHeader Then
     Me.HeaderPanel.Enabled = True
End If

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

Может ли кто-нибудь привести пример более элегантного решения (ABAC или иным) для лучшего способа справиться с этим?

1 Ответ

0 голосов
/ 01 февраля 2019

Исходя из того, что вы сказали, например:

[...], но его трудно поддерживать, он очень специфичен для класса, с которым я работаю, и требуеткод, который будет компилироваться каждый раз при изменении разрешений (что часто происходит)

Похоже, вам нужен способ для экстернализации вашей авторизации из приложения, для которого именно предназначен контроль доступа на основе атрибутов.Итак, вы на правильном пути!:-)

Прежде всего, полное раскрытие, я работаю в Axiomatics , компании, которая предоставляет решения по управлению доступом на основе атрибутов, которые иногда называют динамической авторизацией.Тем не менее, я постараюсь рассказать вам, как добиться того, что вам нужно, и это будет зависеть от поставщика.

Краткий обзор управления доступом на основе атрибутов и расширяемого языка разметки управления доступом

Расширяемый язык разметки управления доступом - это язык, основанный на стандартахдля атрибутного контроля доступа.Он определяет архитектуру и модель обработки, описывающую, как оценивать запросы доступа.

ABAC architecture

Архитектура содержит следующие компоненты:

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.

Если у вас есть какие-либо вопросы о том, что я освещал, пожалуйста, дайте мне знать.

...