115 messaggi dal 26 febbraio 2007
Ciao,

Attualmente in un Middleware di autenticazione ho questo codice:

httpContext.User = new GenericPrincipal(new ClaimsIdentity(new Claim[] { claimUser }, "basic"), userData.Rules.ToArray());

In cui le Rules associate al mio utente corrispondono ai ruoli.

Adesso ho l'esigenza di aggiungere altri concetti oltre che ai ruoli, in pratica devo creare anche altri 2 insiemi (gruppi e categorie)

Quindi avrei bisogno di creare qualcosa del tipo

new GenericPrincipal(....., roles, gruppi, categorie)

Quale è il modo migliore per estendere la classse GenericPrincipal in modo da supportare questi 2 nuove List<string>


Al momento mi era venuto in mente di creare due Claim (gruppi e ruoli), contenenti la lista in formato string separata da ;

var claimAgencies = new Claim("agencies", String.Join(";", userData.Agencies != null ? userData.Agencies.ToArray() : new string[0]));
var claimFunctionality = new Claim("functionality", String.Join(";", userData.Functionality != null ? userData.Functionality.ToArray() : new string[0]));



PS: non sto utilizzando l'autenticazione standard perchè qua ho esigenze un pò particolari, sono tutte chimate API stateless che si basano ad ogni chiamata su Auth Basic
Modificato da Federico.C il 06 febbraio 2019 10:32 -
11.724 messaggi dal 09 febbraio 2002
Contributi
Ciao Federico,
credo non ci sia bisogno di estendere GenericPrincipal perché, come hai intuito, tutte le informazioni accessorie a proposito dell'utente le puoi caricare nella ClaimsIdentity come Claim. E questa ClaimsIdentity la inserisci all'interno di una ClaimsPrincipal (non GenericPrincipal).


var claimAgencies = new Claim("agencies", String.Join(";", userData.Agencies != null ? userData.Agencies.ToArray() : new string[0]));


L'approccio di creare dei tuoi Claim con tipi personalizzati tipo "agencies" e "functionality" è corretto, però non fare uno String.Join dei valori. Piuttosto, aggiungi più Claim con lo stesso tipo. Esempio:
if (userData.Agencies != null) {
 foreach (var agency in userData.Agencies) {
   identity.AddClaim(new Claim("agency", agency));
 }
}


Per i ruoli usa il tipo ClaimTypes.Role. Ti tornerà utile in fase di autorizzazione. Esempio:
if (userData.Rules != null) {
 foreach (var rule in userData.Rules) {
   identity.AddClaim(new Claim(ClaimTypes.Role, rule));
 }
}


ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.