Sono già state poste molte domande sull'autenticazione basata sulle attestazioni e sulle differenze con altri approcci: Basato sui ruoli e basato sui reclami Spiega l'autenticazione basata sulle attestazioni Ora, la mia risposta preferita è una data su stackoverflow: Utilizzo dell'autenticazione basata sulle attestazioni .
Tuttavia, dopo averli letti, la mia domanda non è stata risolta. La domanda che ho è duplice:
- Esiste una differenza tra attestazioni e attributi (ABAC)?
- Se possiamo considerare un "ruolo" come una rivendicazione, qual è il particolare vantaggio dell'autorizzazione basata sulle attestazioni sull'autorizzazione basata sui ruoli? ( nota: sto utilizzando un'autorizzazione anziché l'autenticazione qui, poiché ritengo che non si tratti veramente dell'autenticazione ).
Per approfondire la mia domanda, fornirò tre esempi di come vedo un'autorizzazione basata sulle attestazioni, basata sui ruoli e basata sugli attributi. Disclaimer: non sono sicuro che questi esempi siano corretti, sono solo parte della mia domanda.
Esempio basato sulle attestazioni
Ho letto un blogpost interessante in cui viene spiegato come utilizzare l'autenticazione basata sulle attestazioni in MVC / Web API. Sembra che (in quel blogpost) un metodo sia protetto (autorizzato) esaminando le attestazioni associate all'utente che sta tentando di accedere al metodo. Se l'utente ha diritto a "vedere" "streetaddress", allora è autorizzato a visualizzare tali dati.
[ClaimsAuthorize("Read", "SomeData")]
public string Get()
{
return “somedata”;
}
Ora, la creazione delle attestazioni è separata da qualche altra parte, che non è realmente specificata in quel blogpost. Suppongo che il metodo nascosto controlli se quell'utente, con quel determinato ruolo, è autorizzato a visualizzare streetaddress. Ora qual è la differenza con l'autorizzazione basata sui ruoli?
Esempio basato sul ruolo
La differenza non mi è chiara, confrontiamola con la vecchia autorizzazione basata sui ruoli. Posso ancora una volta definire un attributo per ciascun metodo, che limita l'esecuzione di tale metodo a determinati ruoli. Il metodo 'view streetaddress' è ad esempio limitato agli utenti con il ruolo 'admin'. Quindi, invece di controllare il ruolo nel metodo separato, lo controlliamo proprio qui. O mi manca qualcosa qui?
[RoleAuthorize('admin')]
public string Get()
{
return “somedata”;
}
Esempio basato su attributi
Vedo il vantaggio di un controllo dell'autorizzazione più granulare. Ma implementerei qualcosa del genere, per definire che solo un utente con il ruolo admin può accedere a "somedata" durante l'orario di lavoro, e solo se quell'utente amministratore ha gli occhi azzurri.:
[AttributeAuthorize('role=admin;time=09-17;eyecolor=blue')]
public string Get()
{
return “somedata”;
}
Questo ultimo esempio mi sembra davvero vantaggioso, ma non sono sicuro se sia o meno lo stesso del mio primo esempio, che è l'autorizzazione basata sulle attestazioni.
Per terminare, è stata visualizzata un'ultima domanda:
- Ciò significa che le attestazioni SONO diverse dagli attributi, in quanto gli attributi vengono utilizzati per definire i diritti di un utente, mentre le rivendicazioni sono questi diritti?