5

Pytanie:Uzyskiwanie bieżącego identyfikatora użytkownika (a nie nazwy) za pomocą uwierzytelniania formularzy?

Używam uwierzytelniania formularzy i mojego własnego dostawcy członkostwa niestandardowego.

Z tego co widzę, mogę uzyskać aktualny FormsIdentity wykonując:

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

I mogę dostać bieżącego użytkownika Membership ten sposób:

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

A potem można uzyskać identyfikatora w ten sposób:

var MyUserId = UserFromDb.ProviderUserKey; 

Co znajdę zabawne jest to, że gdy zgłoszę Membership.GetUser(), a następnie go calles tej metody w dostawcę członkostwa

public override MembershipUser GetUser(string username, bool userIsOnline) 

który wygląda się informacje o użytkowniku w bazie danych.
Więc co pomyślałem, to że ramy .NET wewnętrznie robi

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

który pobiera informacje użytkownika z bazy danych na podstawie nazwy użytkownika. Uważam, że jest to niepokojące, ponieważ jest to złe dla wydajności, gdy muszę wyszukać użytkownika, aby uzyskać identyfikator użytkownika.

Po drugie, niepokojące jest to, że muszę w ogóle wyszukać użytkownika, ponieważ tego nie oczekiwałbym.

Po trzecie, jest to niepokojące, ponieważ nazwa użytkownika może zostać zmieniona w trakcie programu, a to bzdura, aby użytkownik musiał się wylogować i zalogować, aby to zrobić.

Teraz dla mnie ten projekt brzmi jak bzdura.
Ale potem znowu, Microsoft używa również nazwy aplikacji, nazwy grupy i nazwy użytkownika jako klucza podstawowego, co również nie ma większego sensu.

Oto moje pytanie:
Czy nie można uzyskać identyfikatora użytkownika bez wyszukiwania bazy danych?

A może pomysł dostawcy członkostwa jest tak połamany przez projekt?

Jeśli jest uszkodzony:
Widziałem, że FormsIdentity ma właściwość string o nazwie userdata. Jeśli tak, jak mogę użyć ASP.NET, aby zapisać tam identyfikator użytkownika?

+6

Witamy w usługodawcach członkowskich ASP.NET; szukanie przykładów wysokiej jakości projektów u tych dostawców może okazać się frustrujące. –

Odpowiedz

2

Tak, można zastosować obejście z dnia here.
Można ustawić UserId w pliku danych uwierzytelniających cookie użytkownika.

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 

Inną możliwością jest użycie UserId.ToString() jako "nazwy".

+3

, ale jak pobrać dane użytkownika? – bflemi3

Powiązane problemy