5

Domanda:Ottenere l'id utente corrente (non nome) utilizzando l'autenticazione moduli?

Sto giocando con l'autenticazione di moduli e il mio provider di appartenenza personalizzato.

Da quello che vedo, posso ottenere il FormsIdentity corrente facendo:

System.Web.Security.FormsIdentity veryFunny= (System.Web.Security.FormsIdentity) 
    System.Web.HttpContext.Current.User.Identity; 

E posso ottenere l'utente appartenenza corrente facendo questo:

 var UserFromDb = System.Web.Security.Membership.GetUser(); 

E poi posso ottenere l'userid facendo così:

var MyUserId = UserFromDb.ProviderUserKey; 

Quello che trovo divertente è che quando chiamo Membership.GetUser(), quindi chiama questo metodo nel provider di appartenenze

public override MembershipUser GetUser(string username, bool userIsOnline) 

Quale cerca le informazioni dell'utente nel database.
Quindi quello che ho capito è che il framework .NET fa internamente

GetUser(System.Web.HttpContext.Current.User.Identity.Name, whatever); 

che ottiene le informazioni utente dal database base al nome utente. Lo trovo inquietante, innanzitutto perché fa male alle prestazioni quando devo cercare un utente intero solo per ottenere l'ID utente.

In secondo luogo, è inquietante che debba cercare l'id utente, perché non è quello che mi aspetterei.

In terzo luogo, è inquietante, perché il nome utente può essere modificato nel corso del programma e non ha senso che l'utente debba disconnettersi e accedere per farlo.

Ora, per me questo disegno sembra un'assurdità.
Ma poi ancora, microsoft usa anche il nome dell'applicazione, il nome del gruppo e il nome utente come chiave primaria, il che in realtà non ha molto senso.

Quindi, ecco la mia domanda:
Non c'è un modo per ottenere l'ID utente senza una ricerca DB?

Oppure l'intera idea del provider di appartenenze è così spezzata dal design?

Se è così rotto:
Ho visto che FormsIdentity ha una proprietà stringa chiamata userdata. In tal caso, come posso utilizzare ASP.NET per salvare l'ID utente lì?

+6

Benvenuti ai provider di appartenenze ASP.NET; cercare esempi di design di alta qualità in questi fornitori può dimostrarsi, uh, frustrante. –

risposta

2

Sì, è possibile eseguire una soluzione da here.
Uno può impostare l'ID utente nel cookie di autorizzazione-Ticket UserData.

public class UserData 
{ 
    public string FirstName { get; set; } 
    public UserData() 
    { 
     FirstName = "Unknown"; 
    } 
} // End Class UserData 



public void SignIn(string userName, bool createPersistentCookie) 
{ 
    if (String.IsNullOrEmpty(userName)) 
     throw new ArgumentException("Der Wert darf nicht NULL oder leer sein.", "userName"); 

    UserData userData = new UserData(); 
    SetAuthCookie(userName, createPersistentCookie, userData); 
    //FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
} 


public void SetAuthCookie(string userName, bool createPersistentCookie, UserData userData) 
{ 
    HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, createPersistentCookie); 
    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 
    FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(
     ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration 
     ,ticket.IsPersistent, userData.ToJSON(), ticket.CookiePath 
    ); 

    string encTicket = FormsAuthentication.Encrypt(newTicket); 
    cookie.Value = encTicket; 
    System.Web.HttpContext.Current.Response.Cookies.Add(cookie); 
} // End Sub SetAuthCookie 

Un'altra possibilità è utilizzare semplicemente UserId.ToString() come "nome".

+3

ma come si recuperano i dati utente? – bflemi3