2009-09-14 11 views
11

Mam stronę internetową, która używa uwierzytelniania formularzy i członkostwa. Użytkownik musi mieć włączoną obsługę plików cookie w celu korzystania z witryny. Poproszono mnie o zmianę kodu, tak aby identyfikator sesji został zmieniony, gdy tylko użytkownik się zaloguje. Prawdopodobnie będzie to chronić przed atakiem z Session Fixation (http://en.wikipedia.org/wiki/Session_fixation). Czy ktoś wie, w jaki sposób mogę zmienić identyfikator sesji bez utraty całej sesji? PHP ma określoną metodę, ale nie mogę znaleźć odpowiednika .NET.jak zmienić identyfikator sesji po zalogowaniu w asp.net

Odpowiedz

5

Here's a blog post, który mówi o tym:

ASP.NET nie obsługuje bezpośrednio funkcjonalność zregenerować sesji ID. Zobacz dokumentację dotyczącą problemu here. Istnieje not-so quick and dirty way do wykonania przez ustawienie wartości ASPNET_SessionID na pusty łańcuch i przekierowanie tak, aby wartość była odnawiana.

+1

ja aslo o tym myśleć, ale po regeneratu, że cały obiekt w obiekcie sesji straci ... – MemoryLeak

+1

blog, do którego prowadzisz link, nie jest już dostępny. –

6

Odpowiedziałem na podobne pytanie pod adresem Generating a new ASP.NET session in the current HTTPContext. Zasadniczo musimy zmienić niektóre z wewnętrznych stanów SessionStateModule, aby móc ponownie wygenerować identyfikator sesji bez utraty obiektów w sesji. Użyłem odbicia, aby ustawić wartość pola _rqId na nowy ID i _rqSessionStateNotFound na wartość true. Wadą jest to, że musimy udzielić "Pełnego Zaufania" do Aplikacji.

+2

[Zaakceptowana odpowiedź] (http://stackoverflow.com/a/1419508/295686) odwołuje się do artykułu skierowanego do .NET 1.1 (i tak naprawdę nie zajmuje się naprawą sesji, tylko ponowne używanie starego identyfikatora sesji), ale to Rozwiązanie było bardziej eleganckie i działało w naszej aplikacji .NET 4.5 (jedna strona MVC i jedna strona Web Forms). – mlhDev

1

Jest to bardzo stare pytanie mam wskrzeszenia, ale tutaj jest rozwiązanie:

var manager = new SessionIDManager(); 
bool redirected, isAdded; 
manager.SaveSessionID(System.Web.HttpContext.Current, 
    "5vonjb4mtb1of2fxvhjvkh5d", out redirected, out isAdded); 

// sessionId now equals "5vonjb4mtb1of2fxvhjvkh5d" 
var sessionId = Session.SessionID; 
+0

Wiem, minęło trochę czasu. Ale wypróbowaliśmy twój kod i nie działa on dla nas. sessionId nie jest równe "5vonjb4mtb1of2fxvhjvkh5d". – mosquito87

+0

Zrobiłem to z sukcesem. sessionid zmienia się na nowy sessionid. – pinopino

+2

To zbliżyło nas, ale nie wystarczająco blisko - wciąż nad nim pracujemy. Dzięki temu zaktualizujesz identyfikator sesji i odeślesz aktualizację plików cookie, tak jak byś tego oczekiwał, ale nadal chcielibyśmy użyć tej sesji podczas tego samego żądania. Nie jesteśmy w stanie zrobić tego teraz - wydaje się, że torba sesyjna jest poprzednią; następne żądanie widzi nową torbę sesji, ale naszych wartości nie ma. – mlhDev

Powiązane problemy