Avendo utilizzato varie tecniche di autenticazione e autorizzazione per decenni, la mia attuale applicazione MVC utilizza la seguente metodologia.
Le attestazioni vengono utilizzate per tutte le autorizzazioni. Agli utenti viene assegnato un ruolo (sono possibili più ruoli ma non ne ho bisogno) - ulteriori informazioni di seguito.
Come è prassi comune, viene utilizzata la classe di attributi A ClaimsAuthorize. Poiché la maggior parte delle azioni del controller sono CRUD, ho una routine nella generazione del database code-first che itera tutte le azioni del controller e crea tipi di attestazioni per ogni attributo di azione del controller di Lettura / Modifica / Crea / Elimina. Ad esempio da,
[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]
Per l'uso in una vista MVC, una classe controller di base presenta gli elementi del carrello di visualizzazione
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);
}
Per i menu del sito Web e altre azioni non del controller, ho altre affermazioni. Ad esempio, se un utente può visualizzare un particolare campo monetario.
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");
}
}
Allora dove si inseriscono i ruoli?
Ho una tabella che collega un ruolo a una serie di attestazioni (predefinita). Quando si imposta l'autorizzazione utente, l'impostazione predefinita è fornire all'utente le rivendicazioni del proprio ruolo. Ogni utente può avere più o meno attestazioni rispetto all'impostazione predefinita. Per semplificare la modifica, l'elenco delle rivendicazioni viene visualizzato dal controller e dalle azioni (di seguito), con altre rivendicazioni elencate. I pulsanti vengono utilizzati con un po 'di Javascript per selezionare una serie di azioni per ridurre al minimo il "clic" richiesto per selezionare le rivendicazioni. Su Salva, le rivendicazioni degli utenti vengono eliminate e tutte le rivendicazioni selezionate vengono aggiunte. L'applicazione Web carica le attestazioni solo una volta, quindi qualsiasi modifica deve richiedere un ricaricamento all'interno di questi dati statici.
I gestori possono quindi selezionare quali attestazioni si trovano in ogni ruolo e quali attestazioni dispone di un utente dopo averli impostati su un ruolo e su tali attestazioni predefinite. Il sistema ha solo un numero limitato di utenti, quindi la gestione di questi dati è semplice