2014-04-03 23 views
12

Dato un set specifico di autorizzazioni, ad es. EditPage, CreateProject, ModifyUser, attualmente sto esaminando due diversi modi di creare alcuni tipi di attestazioni personalizzate per modellare questo comportamento. Posso trovare poche informazioni online sul modo migliore per farlo e sperare in qualche feedback su come l'hai fatto nei tuoi sistemi.Best practice per la creazione di tipi di attestazione personalizzati

Il primo approccio che ho considerato è quello di utilizzare un "azione" tipo di attestazione, con l'azione specifica specificata dal valore del credito:

var claims = new [] 
{ 
    new Claim("http://schemas.company.com/claims/project/action", "EditPage"), 
    new Claim("http://schemas.company.com/claims/project/action", "CreateProject"), 
    new Claim("http://schemas.company.com/claims/project/action", "ModifyUser") 
} 

Il secondo approccio è quello di utilizzare il tipo rivendicazione stessa per definire l'azione eseguita, il valore non viene utilizzato. Questo è come uno stile di sicurezza "PossessProperty" in cui, finché l'utente ha il claimtype, possono eseguire l'azione.

var claims = new [] 
{ 
    new Claim("http://schemas.company.com/claims/project/editpage", ""), 
    new Claim("http://schemas.company.com/claims/project/createproject", ""), 
    new Claim("http://schemas.company.com/claims/project/modifyuser", "") 
} 

Da notare anche, nei tipi di attestazioni di cui sopra ho incluso un discriminatore "progetto" in modo che possa distinguere tra un utente che può modificare una pagina in Project A ma non Progetto B.

Noi stiamo anche pianificando di archiviare tutte queste rivendicazioni personalizzate in un database centrale di "Autorizzazione", quindi è richiesta l'unicità.

Qualsiasi pensiero o feedback sarebbe molto apprezzato.

risposta

9

Bene: non hai fornito ulteriori dettagli sul tuo intento, ma se intendi rendere queste affermazioni parte dell'identità dell'utente, questo è chiaramente un anti-modello.

Le attestazioni descrivono l'identità dell'utente (che potrebbe includere dati di autorizzazione a grana grossa come i ruoli). Per prendere decisioni di autorizzazione più dettagliate, utilizzare qualcosa come ClaimsAuthorizationManager in .NET.

In questo punto estensibilità di prendere una decisione informata sulla base di

a) l'identità dell'utente b) la risorsa che l'utente sta tentando di accedere c) l'operazione che l'utente sta cercando di fare il risorsa

Quindi, in altre parole, le affermazioni sono l'input delle decisioni di autorizzazione, non la risposta diretta.

+0

Grazie, speravo che avresti risposto a questo. Mi sono piaciuti molto i tuoi video di Pluralsight. In effetti sto utilizzando ClaimsAuthorizationManager, ma devo ancora iniziare a implementare le politiche. Il requisito è quello di avere una sicurezza granulare molto fine, in modo che agli utenti vengano concessi diritti specifici per eseguire azioni specifiche, ad es. caricare immagini, modificare pagine, ecc. Stavo pensando che i diritti/azioni/permessi specifici sarebbero stati modellati ciascuno come una richiesta individuale. Ma stai dicendo che è un anti-modello. Quindi questa intera sicurezza a grana fine è un anti-modello? Sono ancora più confuso ora. – mikesigs

+1

No per niente;) Semplicemente non rendere tutte queste affermazioni parte del ClaimsPrincipal. – leastprivilege

+0

Quindi le affermazioni "azione" non sono più richieste allora. Non vengono memorizzati con ClaimsPrincipal durante la trasformazione delle attestazioni. Piuttosto, il gestore autorizzazioni dovrebbe controllare le autorizzazioni specifiche tramite qualche chiamata di servizio/ricerca db? Speravo di avere un set statico di criteri, ma non funzionerebbe con questo modello. – mikesigs

Problemi correlati