Пользовательская логика авторизации MVC 5 с использованием аутентификации Windows

У меня есть проект MVC 5 с аутентификацией Windows.

Я использую WindowsTokenRoleProvider по умолчанию в качестве поставщика ролей, и он работает в следующей ситуации:

[CustomAuthorization(Roles = "DOMAIN\example_group")]
public ActionResult Action()...

Работает отлично. Проблема начинается, когда я хочу использовать пользовательскую роль, например: "Утверждающий". Чтобы проверить, кто является настоящим утверждающим, мне нужно запросить специальную таблицу и использовать собственную логику, чтобы решить, является ли текущий человек утверждающим.

Для этого я переопределил AuthorizeCore из CustomAuthorizeи написал что-то вроде этого:

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    if(CheckIfCurrentUserIsAnApprover()){
        return true;
    }
    ...........
}

Но что будет, когда я добавлю еще одну роль, скажем ManagersЯ должен добавить:

if(CheckIfCurrentUserIsManager()){
        return true;
}

Как я могу сделать его более общим?

1 ответ

Это очевидный случай для управления доступом на основе атрибутов (ABAC).

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

В ABAC вы можете писать политики контроля доступа, такие как:

  • пользователь с ролью == утверждающий может выполнить действие == для объекта типа == транзакция, если user.location == object.location.

Язык, используемый для написания политик - XACML (язык разметки расширяемого контроля доступа).

XACML также определяет архитектуру с понятием:

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

Вы можете прочитать больше здесь: http://developers.axiomatics.com/blog/index/entry/xacml-reference-architecture.html. Аксиоматика обеспечивает.net двигатель и.net pep.

Другие вопросы по тегам