Використовуючи різні методи автентифікації та авторизації протягом десятиліть, моя поточна програма MVC використовує наступну методологію.
Претензії використовуються для всіх дозволів. Користувачам призначається одна роль (можливі кілька ролей, але мені це не потрібно) - докладніше нижче.
Як звичайна практика, використовується клас атрибутів A ClaimsAuthorize. Оскільки більшість дій контролера є CRUD, у мене є генерація бази даних першого коду, яка переглядає всі дії контролера і створює типи претензій для кожного атрибута дії контролера Read / Edit / Create / Delete. Наприклад, від,
[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]
Для використання в режимі MVC View базовий клас контролера представляє елементи мішка подання
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// get user claims
var user = filterContext.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
// Get all user claims on this controller. In this controler base class, [this] still gets the descendant instance type, hence name
List<Claim> claims = user.Claims.Where(c => c.Type == this.GetType().Name).ToList();
// set Viewbag with default authorisations on this controller
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)
{
// get user claims
var user = this.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
// Get the specific claim if any
return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue);
}
return false;
}
public bool UserHasTradePricesReadClaim
{
get
{
return UserHasSpecificClaim("TradePrices", "Read");
}
}
Отже, де вкладаються Ролі?
У мене є таблиця, яка пов'язує роль із набором вимог (за замовчуванням). При встановленні авторизації користувача за замовчуванням надається користувачеві вимоги щодо своєї ролі. Кожен користувач може мати більше або менше претензій, ніж за замовчуванням. Щоб спростити редагування, список претензій відображається контролером та діями (підряд), а потім інші списки претензій. Кнопки використовуються з бітом Javascript для вибору набору дій для мінімізації "клацання", необхідного для вибору претензій. У режимі "Зберегти" претензії користувачів видаляються, а всі вибрані претензії додаються. Веб-програма завантажує претензії лише один раз, тому будь-які зміни повинні викликати перезавантаження в межах цих статичних даних.
Тому менеджери можуть вибрати, які претензії є в кожній ролі, а які претензії у користувача після встановлення їм ролі та тих претензій за замовчуванням. Система має лише невелику кількість користувачів, тому управління цими даними є простим