Używając różnych technik uwierzytelniania i autoryzacji przez dziesięciolecia, moja obecna aplikacja MVC korzysta z następującej metodologii.
Oświadczenia są używane do wszystkich autoryzacji. Użytkownicy mają przypisaną jedną rolę (możliwych jest wiele ról, ale nie potrzebuję tego) - więcej poniżej.
Zgodnie z powszechną praktyką używana jest klasa atrybutu ClaimsAuthorize. Ponieważ większość akcji kontrolera to CRUD, mam procedurę w generowaniu bazy danych z pierwszym kodem, która iteruje wszystkie akcje kontrolera i tworzy typy oświadczeń dla każdego atrybutu akcji kontrolera odczytu / edycji / tworzenia / usuwania. Np. Z
[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]
Do użycia w widoku MVC klasa kontrolera bazowego przedstawia elementy widoku torby
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);
}
W przypadku menu witryny internetowej i innych działań niezwiązanych z administratorem mam inne zastrzeżenia. Np. Czy użytkownik może przeglądać określone pole pieniężne.
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");
}
}
Więc gdzie pasują role?
Mam tabelę, która łączy rolę z (domyślnym) zestawem oświadczeń. Podczas ustawiania autoryzacji użytkownika domyślnie przypisuje się użytkownikowi roszczenia dotyczące jego roli. Każdy użytkownik może mieć więcej lub mniej roszczeń niż domyślne. Aby ułatwić edycję, lista oświadczeń jest wyświetlana według kontrolera i działań (w wierszu), a następnie są wyświetlane inne oświadczenia. Przyciski są używane z odrobiną JavaScript do wybierania zestawu działań minimalizujących „klikanie” wymagane przy wybieraniu roszczeń. Po zapisaniu roszczenia użytkowników są usuwane, a wszystkie wybrane roszczenia są dodawane. Aplikacja internetowa ładuje oświadczenia tylko raz, więc wszelkie zmiany muszą powodować ponowne załadowanie tych danych statycznych.
W związku z tym menedżerowie mogą wybrać, które oświadczenia należą do poszczególnych ról, a które mają użytkownik po przypisaniu mu roli, a także oświadczenia domyślne. System ma tylko niewielką liczbę użytkowników, więc zarządzanie tymi danymi jest proste