2011-12-27 14 views
6

Wiem, że dostawca członkostwa przechowuje nazwę użytkownika i czas wygaśnięcia w zaszyfrowanym pliku cookie, a następnie używa go do sprawdzenia, czy użytkownik jest nadal zalogowany na sesję.Hasło użytkownika sklepu ASP.Net Store w pliku cookie sesji?

Czy będzie możliwe zapisanie hasła użytkownika również w tym zaszyfrowanym pliku cookie. Jeśli tak, to w jaki sposób uzyskasz dostęp do strony serwera?

Potrzebuję nazwy użytkownika i hasła dostępnego po stronie serwera, ponieważ muszę połączyć się z usługami sieciowymi, które używają tych samych poświadczeń. Czy jest jakiś lepszy sposób na zrobienie tego?

Odpowiedz

10

Należy przechowywać go w stanie sesji, który nigdy nie opuszcza serwera.

Powinieneś także spróbować zmienić te usługi internetowe, aby używać biletów uwierzytelniających zamiast haseł (np. OAuth), ponieważ nigdy nie jest dobrym pomysłem przechowywanie haseł w postaci zwykłego tekstu.

+2

Czy zapisałbym je w stanie sesji, gdy użytkownik został po raz pierwszy uwierzytelniony? Jak upewnić się, że sesja członkostwa wygasa w tym samym czasie co stan sesji? Będę ich potrzebował, aby pozostać zsynchronizowany, jak sądzę. –

+0

@metalideath - Tak, zapisz je tak szybko, jak tylko będziesz w stanie. Jeśli sesja się zakończy, albo użytkownik wyczyści swoje pliki cookie (i tym samym utraci odniesienie do ich sesji) lub limit czasu sesji, konieczne będzie ponowne uwierzytelnienie użytkownika i ponowne przywrócenie hasła w sesji. – Omar

+0

Czy stan sesji działa w środowisku wielu serwerów? –

2

Niezalecane, ale można użyć FormsAuthenticationTicket.UserData.

+0

O ile mogę powiedzieć, nie jest to to samo, co poleca SLAKS? Nie do końca rozumiem różnicę między sesją członkowską a stanem sesji. Może nie ma różnicy i to mnie mylą. –

+0

@metalideath. Plik cookie sesji jest zupełnie inny niż plik cookie do uwierzytelniania formularzy. Przeczytaj rozdział "Uwierzytelnianie formularzy" w księdze Stefana Schackowa, aby uzyskać pełne zrozumienie. –

+0

@metalideath: Przechodzi bezpośrednio do pliku cookie formularzy na kliencie. Nie polecałbym tego. – SLaks

3

Tak, możesz to zrobić. Przekazać informacje zakodowane w dziedzinie userData konstruktora FormsAuthenticationTicket:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(version, 
    name, issueDate, expirationDate, isPersistent, yourEncodedData); 
    string secureTicket = FormsAuthentication.Encrypt(ticket); 
    Response.Cookies.Add(
     new HttpCookie(FormsAuthentication.FormsCookieName, secureTicket)); 

Idealnie, powinno się to odbywać za pośrednictwem połączenia SSL, a ciasteczka bilet powinien być oznaczony zarówno HttpOnly i zabezpieczyć atrybutów.

Następnie, aby pobrać wartość:

FormsIdentity id = (FormsIdentity)User.Identity; 
FormsAuthenticationTicket ticket = id.Ticket; 
string yourEncodedInfo = ticket.UserData; 

Można też po prostu ustawić własny plik cookie, odrębnej od formy biletu auth.

Jednakże przechowywanie hasła bezpośrednio w pliku cookie, nawet jeśli jest zaszyfrowane, nie jest dobrym pomysłem z punktu widzenia bezpieczeństwa. Zamiast tego użyj stanu sesji:

Session["password"] = password; 

Stan sesji również używa pliku cookie, ale sam plik cookie zawiera tylko klucz. Serwer używa klucza, aby uzyskać słownik par klucz/wartość unikalny dla tej sesji, który pozostaje na serwerze (lub zostaje sparametryzowany do bazy danych, w zależności od konfiguracji).

+0

Dziękujemy za przykład użycia stanu sesji, +1 za to . –

Powiązane problemy