2012-03-12 3 views
6

Uso FormsAuthentication, ma ho aggiunto un membro MemberShipProvider personalizzato per la convalida con una tabella utente personalizzata.Procedura consigliata per mantenere un ID utente (MVC)

Tutte le tabelle contenenti "dati utente" hanno una colonna idUser, quindi ho bisogno di mantenere l'id utente per presentare all'utente i suoi dati.

In precedenza ho utilizzato una variabile di sessione (ASP.NET Webform), ma mentre sto riscrivendo l'applicazione web su MVC, vorrei chiedere che cosa è generalmente considerato l'approccio migliore per questo.

È la variabile di sessione ancora il posto migliore per contenere l'idUser, o dovrei aggiungere un "Current.User.Identity" personalizzato che oltre al nome utente contiene anche un ID utente pubblico ??

O dovrei scegliere un approccio completamente diverso?

risposta

3

Ho avuto la stessa domanda quando ho implementato un provider di appartenenza personalizzato per MVC. Ho finito per fare due cose. Memorizzo l'ID dell'utente nel campo ProviderUserKey dell'oggetto MembershipUser. Vedi provideruserkey. Quindi per rispondere alla tua domanda, sì ho creato un principal personalizzato da System.Web.Security.IPrincipal, sebbene in seguito abbia ereditato da System.Web.Security.RolePrincipal invece che volevo il supporto per i ruoli.

public class MyPrincipal : RolePrincipal 
{ 
    public Guid Id { get; set; } 

    public MyPrincipal(string providerName, IIdentity identity, Guid id) : base(identity) 
    { 
     Id = id; 
    } 
} 

Update: Il motivo non ho voluto usare la sessione nel mio caso è perché ho disabilitato per l'applicazione. Ho letto che il concetto alla base di MVC è la separazione delle preoccupazioni, e questo è strettamente legato al modo in cui funziona il web, che è senza stato. Anche se non riesco a ricordare dove leggo ora che cerco di ricordare. Tuttavia ricordo anche di aver letto che se riesci ad eliminare la sessione dovresti farlo. Permetterà a IIS di servire richieste simultanee dalla tua app piuttosto che dover aspettare che una richiesta finisca (e rilasciare la sessione dell'utente) prima che la richiesta successiva possa usare la sessione e inviare la sua risposta. Il più grande impatto è il caricamento del contenuto della pagina usando Ajax.

+0

Grazie! Stavo pensando ad un approccio simile. Sebbene io sia d'accordo con @Mark S. sopra, la cosa più semplice è usare l'oggetto session. – Kman

+0

Aggiunti dettagli sul motivo per cui ho evitato la sessione –

+0

La sessione non è necessariamente malvagia e può essere una necessità. Spesso vedo gli utenti disabilitare la sessione e iniziare a fare troppo affidamento sui cookie aumentando la dimensione di ogni richiesta HTTP. Un altro modo per servire le richieste simultanee è utilizzare i controller asincroni, che è piuttosto semplice nella MVC4 beta e può essere fatto con un po 'di lavoro nelle versioni precedenti. – Mark

3

I nomi utente sono unici? In tal caso, non è necessario mantenere l'ID utente poiché è possibile recuperare semplicemente un utente tramite nome utente.

I miei progetti MVC hanno implementato l'appartenenza in un modo molto simile a un'applicazione Web Form tradizionale. Non penso ci sia alcun motivo per guardare i due in modo diverso a meno che non si stia tentando di creare un'applicazione di tipo REST stateless. Come hai mantenuto il tuo UserId nei Web Form? Sessione? Quindi utilizzare la sessione in MVC. Non c'è motivo di reinventare la ruota.

Ovviamente se si hanno altri motivi per cambiare ci sono molti modi per memorizzare l'ID utente. È possibile memorizzarlo nei Dati utente del cookie di autenticazione. È anche possibile creare il proprio ticket di autenticazione che utilizza UserId come chiave piuttosto che come nome utente. Potresti anche creare un preside personalizzato per memorizzare alcune informazioni aggiuntive.

Si consiglia di rivedere Forms Authentication Configuration and Advanced Topics. Questo articolo tratta la memorizzazione di dati aggiuntivi (UserId) nel ticket di autenticazione e la creazione di un principal personalizzato. Entrambi i metodi sarebbero adatti alle tue esigenze.

+0

I nomi utente sono unici, ma ho bisogno di userId perché questa è la colonna Identity nel mio modello (database). Quindi ottenere i dati da una tabella ho bisogno di interrogarlo con ... dove userid = idUser. Vedrò il link che hai fornito :) – Kman

+0

Sessione è il modo più semplice e veloce per mantenere il tuo UserId. L'uso di MVC non preclude certamente l'uso della sessione. I miei 2 centesimi, usa la sessione. – Mark

+0

Sono d'accordo. Sta andando bene nella mia applicazione webform. La mia preoccupazione principale era che in MVC quell'approccio era "obsoleto". Grazie ancora!:) – Kman