2009-04-03 11 views
7

Jednym z wymagań zaproponowanych dla aplikacji ASP.NET jest globalne wyłączenie stanu sesji. (To nie podlega negocjacji.)Uwierzytelnianie użytkownika bez stanu sesji w ASP.NET

Kolejnym wymogiem jest to, że mamy pewne środki do uwierzytelnienia użytkownika. Zastanawiam się nad wykorzystaniem modelu dostawcy członkostwa ASP.NET.

Czy możliwe jest uwierzytelnianie użytkownika bez stanu sesji?

Konkretne przykłady uwierzytelniania użytkowników szukamy to:

  • użytkownik przechodzi na stronę nieuwierzytelnionym
  • Użytkownik wprowadzi dane rejestracyjne (pola kontaktowe, itp)
  • Do końca ich sesji , użytkownik ma dostęp do pewnych treści dzięki ich zarejestrowanemu statusowi:

Czy można to zrobić za pomocą plików cookie?

Czy można to zrobić bezpiecznie, więc cookie nie może być łatwo sfałszowane?

Czy jest dostępna wbudowana funkcjonalność w ASP.NET, aby to wspierać, czy będziemy musieli przetasować własną metodę?

Odpowiedz

12

Uwierzytelnienie ASP.NET Forms nie używa SessionState. Używa pliku cookie do przechowywania biletu uwierzytelniającego.

Można również wymusić wysłanie biletu uwierzytelniającego za pośrednictwem kanału SSL, edytując plik web.config.

Wszystkie potrzebne funkcje są dostępne w ASP.NET.

http://msdn.microsoft.com/en-us/library/aa480476.aspx

+0

Świetne ... wygląda na to, że potrzebuję klucza validationKey i deszyfrowaniaKey muszą być identyczne na wszystkich serwerach w farmie sieciowej, aby to działało. – frankadelic

+0

jeśli jesteś na farmie internetowej, tak. –

0

Tak, można korzystać z plików cookie.

Problem z ciasteczkami polega na tym, że nie można przechowywać w nich dużej ilości danych. W przypadku rejestracji typu kreatora przechowuję dane w bazie danych, a następnie zapisuję klucz/identyfikator wiersza w zaszyfrowanym pliku cookie. W ten sposób, gdy użytkownik przejdzie do następnego kroku, możesz pobrać dane z bazy danych.

W przypadku plików cookie można oznaczyć i zaszyfrować wartości plików cookie. Zazwyczaj nie zarządzam stanem uwierzytelnienia użytkownika. Używam wbudowanych klas FormsAuthentication do zarządzania tym aspektem moich aplikacji internetowych.

Duże witryny, takie jak: Myspace i Live Search Club, polegają wyłącznie na plikach cookie jako zarządzaniu stanem.

2

Oczywiście, ciasteczko to zrobi.

Pomyśl o podstawach. Stan sesji jest zarządzany przez pliki cookie.

Oto, co robisz.

Po zalogowaniu użytkownik bierze swój identyfikator użytkownika i limit czasu (więc logowanie trwa tylko przez np. 30 minut lub cokolwiek innego).

Weź ten ciąg i pomóż go.

(Java, nie ważne tho)

String cookie = userid + ":" + timeString + ":" + md5(userid + ":" + timeString + ":" + "secretpassword"); 

Wtedy, gdy żądanie uderza swoją witrynę, sprawdź cookie. Najpierw sprawdź to pod kątem integralności.

String parts[] = cookie.split(":"); 
String newHash = md5(parts[0] + ":" + parts[1] + ":" + "secret password"); 
if (!newHash.equals(parts[2])) { 
    // boom, cheater! 
} 

Następnie sprawdź ciąg czasu, aby sprawdzić, czy nadal są "zalogowani", i stamtąd.

Upewnij się, że robisz czas na aktualizację pliku cookie na każde żądanie.

+1

jest to jednak bardzo zła praktyka, pod względem bezpieczeństwa. Jeśli tajne hasło wycieknie, gdy ktokolwiek będzie mógł zalogować się do aplikacji. A jeśli jest słaby, może zostać popękany (szczególnie, gdy MD5 zanika). Jeśli chcesz to zrobić, użyj co najmniej innego losowego "sekretu" dla każdego użytkownika. To byłoby o wiele bezpieczniejsze. –

+0

Jak zarządzałbyś inną sesją uwierzytelnianą dla każdego użytkownika? – yfeldblum

+0

To jest kluczowy problem z kontrolą, masz taki sam problem z dowolnym szyfrowaniem. Nie lubię MD5, wybierz SHA. To przykład techniki. –

Powiązane problemy