В моем текущем приложении MVC, использующем различные методы аутентификации и авторизации на протяжении десятилетий, используется следующая методология.
Претензии используются для всей авторизации. Пользователям назначается одна роль (возможно несколько ролей, но мне это не нужно) - подробнее ниже.
Как обычно, используется класс атрибута ClaimsAuthorize. Поскольку большинство действий контроллера являются CRUD, у меня есть процедура в генерации базы данных с первым кодом, которая повторяет все действия контроллера и создает типы утверждений для каждого атрибута действия контроллера Read / Edit / Create / Delete. Например, от,
[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]
Для использования в представлении MVC базовый класс контроллера представляет элементы пакета представления
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var user = filterContext.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
List<Claim> claims = user.Claims.Where(c => c.Type == this.GetType().Name).ToList();
ViewBag.ClaimRead = claims.Any(c => c.Value == "Read");
ViewBag.ClaimEdit = claims.Any(c => c.Value == "Edit");
ViewBag.ClaimCreate = claims.Any(c => c.Value == "Create");
ViewBag.ClaimDelete = claims.Any(c => c.Value == "Delete");
}
base.OnActionExecuting(filterContext);
}
В отношении меню веб-сайтов и других действий, не связанных с контроллером, у меня есть другие претензии. Например, может ли пользователь просматривать определенное денежное поле.
bool UserHasSpecificClaim(string claimType, string claimValue)
{
var user = this.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue);
}
return false;
}
public bool UserHasTradePricesReadClaim
{
get
{
return UserHasSpecificClaim("TradePrices", "Read");
}
}
Так где же роли?
У меня есть таблица, которая связывает роль с набором утверждений (по умолчанию). При настройке авторизации пользователя по умолчанию пользователь получает утверждения своей роли. У каждого пользователя может быть больше или меньше требований, чем указано по умолчанию. Чтобы упростить редактирование, список утверждений отображается контроллером и действиями (в строке), а затем перечислены другие утверждения. Кнопки используются с фрагментом Javascript для выбора набора действий, чтобы минимизировать «щелчки», необходимые для выбора утверждений. При сохранении заявки пользователей удаляются и добавляются все выбранные утверждения. Веб-приложение загружает заявки только один раз, поэтому любые изменения должны вызывать перезагрузку этих статических данных.
Таким образом, менеджеры могут выбрать, какие утверждения находятся в каждой роли, а какие утверждения есть у пользователя после установки для них роли и этих утверждений по умолчанию. В системе небольшое количество пользователей, поэтому управлять этими данными несложно.