19 messaggi dal 17 febbraio 2013
Ciao a tutti,
mi è stato chiesto di implementare la gestione utenti e ruoli in un piccolo gestionale con database MySql.
Al momento questo gestionale ha diverse "Aziende" per l'accesso alle quali, una stessa persona, deve avere diversi account.
Questo perchè una persona può avere accesso ad una o più Aziende, nelle quali può ricoprire diversi ruoli.

La mia idea era quella di gestire questa combinazione utilizzando una tabella del tipo:

UserId;AziendaId;Role

A questo punto, a runtime, dopo che l'utente ha effettuato il login, in base all'Azienda selezionata (magari tramite un combobox nella testata della pagina) o alla "change" della stessa, da codice, vorrei modificare in tempo reale il ruolo di appartenenza.

Più che una domanda tecnica, volevo un parere da voi per capire se può essere un approccio corretto, anche in termini di prestazioni, o se possono esserci delle controindicazioni particolari nell'utilizzo delle sessioni e dei ruoli così gestiti.

Grazie a chiunque voglia darmi un parere :-)
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
penso che personalmente, anziché usare Membership API, cercherei di sfruttare ASP.NET Identity ed il suo supporto ai claims, che sono banalmente delle coppie chiave-valore di informazioni.
Per ogni utente, creerei un claim per ogni azienda a cui appartiene, in modo da porterci scrivere il ruolo ricoperto. Questi claims verrebbero poi cachati nel cookie di autenticazione, così che l'applicazione non debba poi andarseli a ripescare dal database ad ogni richiesta.
Quando l'utente invia una richiesta al sito, in base all'azienda che aveva selezionato in precedenza, andrei a leggermi il ruolo dal relativo claim e lo userei come ruolo effettivo per la richiesta corrente.
Trovi un esempio in questo articolo:
http://bitoftech.net/2015/03/31/asp-net-web-api-claims-authorization-with-asp-net-identity-2-1/
Guarda in particolare il paragrafo "Assigning claims to the user on the fly" e il punto in cui definisce il metodo RolesFromClaims, dove imposta appunto il ruolo al volo in base al valore di un claim.

Se lo reputi troppo elaborato o non puoi abbandonare Membership API, puoi sempre cachare tutto in una variabile Session, alla vecchia maniera.
Ricorda però che l'identità dell'utente è una cosa diversa dalla Session, che può sparire in qualsiasi momento (es. se l'utente chiude e riapre il browser).

ciao,
Moreno
Modificato da BrightSoul il 28 febbraio 2016 12.45 -

Enjoy learning and just keep making
19 messaggi dal 17 febbraio 2013
Prima di tutto grazie per il suggerimento, ma in questo momento non ho i "tempi tecnici" per affrontare un nuovo approccio (se non proprio indispensabile), anche se sicuramente è un ottimo suggerimento per un futuro nuovo progetto.

Tornando al quesito originale, secondo voi è una strada percorribile quella di modificare i ruoli di un utente a runtime utilizzando i classici

Roles.AddUserToRole("user", "role")


e

Roles.RemoveUserFromRole("user", "role")



Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Sì, quando l'utente cambia l'azienda dal menu a tendina puoi "sistemare" i suoi ruoli ma tieni presente che Roles API dovrà effettuare una connessione al database per recuperare i ruoli ad ogni richiesta di pagina.

Se vuoi evitare questo, puoi mettere l'elenco dei ruoli in cache nel cookie impostando cacheRolesInCookie="true" nel nodo system.web/roleManager del web.config.

Ora, che succede se cambi i ruoli dopo l'emissione del cookie? Il cookie viene aggiornato con i nuovi ruoli oppure no? Dalla documentazione si legge:

The cookie is dynamically updated to cache the most recently validated role names.

Per sicurezza fai un test per verificare che i ruoli cambino in accordo con l'azienda selezionata.

ciao,
Moreno

Enjoy learning and just keep making
19 messaggi dal 17 febbraio 2013
Grazie per il suggerimento :)

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.