Пользовательская логика авторизации 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.