2010-03-16 12 views
12

Po wielu poszukiwaniach nie otrzymałem żadnych odpowiedzi iw końcu musiałem do ciebie wrócić. Poniżej wyjaśniam szczegółowo mój problem. To za długo, więc proszę, nie opuszczaj czytania. Wyjaśniłem mój problem w prostym języku.ASP.NET MVC RememberMe

Pracowałem nad projektem asp.net mvc. Używam standardowych ról ASP.NET i członkostwa. Wszystko działa dobrze, ale funkcja pamiętania mnie nie działa wcale. Wymieniam wszystkie szczegóły pracy. Mam nadzieję, że pomożesz mi rozwiązać ten problem.

I wystarczy to:

Potrzebuję użytkownika, aby zalogować się do aplikacji internetowej. Podczas logowania mogą się zalogować, pamiętając o mnie lub bez niego. Jeśli użytkownik loguje się z pamięcią, chcę, aby przeglądarka pamiętała je przez długi czas, powiedzmy co najmniej jeden rok lub znacznie dłuższy czas. Sposób, w jaki robią to na www.dotnetspider.com, www.codeproject.com, www.daniweb.com i wielu innych stronach. Jeśli użytkownik zaloguje się, nie pamiętając mnie, to przeglądarka powinna zezwolić na dostęp do strony internetowej przez około 20-30 minut, a potem ich sesja powinna wygasnąć. Ich sesja powinna również wygasnąć, gdy użytkownik zaloguje się i zamknie przeglądarkę bez wylogowania.

Uwaga: Z powodzeniem wdrożyłem powyższą funkcjonalność bez korzystania ze standardowych ról i członkostwa w asp.net, tworząc własne talby dla użytkownika i uwierzytelniając przy użyciu mojej tabeli bazy danych, ustawiając pliki cookie i sesje w innych moich projektach. Ale w tym projekcie zaczynaliśmy od początku używać standardowych ról asp.net i członkostwa. Myśleliśmy, że to zadziała i po tym, jak wszystko zostało zbudowane w czasie testów, to po prostu nie zadziałało. a teraz nie możemy zastąpić istniejącej funkcjonalności standardowymi rolami asp.net i członkostwem własnymi niestandardowymi tabelami użytkowników i wszystkimi rzeczami, rozumiecie o co mi chodzi.

Albo jest jakiś błąd ze standardowymi rolami asp.net i funkcjonalnością członkostwa albo mam całą koncepcję standardowych ról asp.net i członkostwa źle. Stwierdziłem, co chcę powyżej. Myślę, że to bardzo proste i rozsądne.

co zrobiłem

  1. Logowanie z nazwę użytkownika, hasło i zapamiętaj pole.
  2. Moje ustawienie w pliku web.config:
    uwierzytelniania
    < mode = "Forms" >
    < formy loginUrl = "~/Konto/logowania" timeout = "2880"/>
    </uwierzytelnianie >

  3. w Moje działanie kontrolera, mam to:

    FormsAuth.SignIn (nazwa użytkownika, rememberMe);

    publiczny void SignIn (string nazwa_użytkownika, bool createPersistentCookie) { FormsAuthentication.SetAuthCookie (userName, createPersistentCookie); }

Teraz problemy są następujące:

już zaznaczono w powyższej sekcji "Po prostu trzeba to". użytkownik może pomyślnie zalogować się do systemu. Ich sesja istnieje przez tyle minut, ile podano w wartości limitu czasu w web.config. Podałem także próbkę mojego pliku web.config. W moim samplem, jeśli ustawię limit czasu na 5 minut, sesja użytkownika wygasa po 5 minutach, to jest w porządku. Ale jeśli użytkownik zamknie przeglądarkę i ponownie otworzy przeglądarkę, użytkownik może nadal wchodzić na stronę internetową bez logowania do czasu określonego w "timeout". Przesuwane wygaśnięcie wartości limitu czasu również działa poprawnie. Teraz, jeśli użytkownik zaloguje się do systemu z zapamiętywaniem mnie zaznaczonym, sesja użytkownika nadal wygasa po 5 minutach. To nie jest dobre zachowanie, prawda ?. Chcę powiedzieć, że jeśli użytkownik zaloguje się do systemu z zapamiętywaniem mnie, powinien być zapamiętany przez długi czas, dopóki nie wyloguje się z systemu lub użytkownik nie usunie ręcznie wszystkich plików cookie z przeglądarki. Jeśli użytkownik zaloguje się do systemu bez zapamiętywania mnie, jego sesja powinna wygasnąć po przekroczeniu limitu czasu określonego w pliku web.config, a także wtedy, gdy użytkownicy zamkną przeglądarkę. Problem polega na tym, że jeśli użytkownik zamknie przeglądarkę i otworzy ją ponownie, może nadal wchodzić na stronę internetową bez logowania.

Często przeszukuję internet na ten temat, ale nie mogłem go rozwiązać. W poście na blogu (http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx) wykonanym przez Scotta Gu na dokładnie ten sam temat. Użytkownicy narzekają na to samo w swoich komentarzach, nie ma łatwego rozwiązania podanego przez pana Scotta.

Czytałem go w następujących miejscach: http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx http://geekswithblogs.net/vivek/archive/2006/09/14/91191.aspx

myślę, że to jest problem z partii użytkowników. Jak wynika z postu na blogu autorstwa pana Scotta Gu.

Twoja pomoc będzie naprawdę doceniana. Z góry dzięki.

+1

Niestety, tldr. :) – kervin

+1

Masz rację. Twoje pytanie jest za długie. Powinieneś zrobić to krócej. –

+0

BTW, to pan Scott Guthrie aka The Gu. –

Odpowiedz

26

To, co chcesz zrobić, to mieć inny limit czasu po zaznaczeniu opcji RememberMe, niż gdy nie jest zaznaczone. Niestety metoda SetAuthCookie nie pozwala ręcznie ustawić daty wygaśnięcia, więc musisz to zrobić samodzielnie.

Problem polega na tym, jak to zrobić?

ASP.NET MVC używa klasy FormsAuthentication System.Web.Security, aby to zrobić, ponieważ nie jest trywialne, jeśli chcesz również obsługiwać ustawienia konfiguracji i przeglądania bez przeglądania plików cookie oraz SSL, ale myślę, że jeśli po prostu to zrobisz :

int timeout = rememberMe ? 525600 : 30; // Timeout in minutes, 525600 = 365 days. 
var ticket = new FormsAuthenticationTicket(userName, rememberMe, timeout); 
string encrypted = FormsAuthentication.Encrypt(ticket); 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted); 
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);// Not my line 
cookie.HttpOnly = true; // cookie not available in javascript. 
Response.Cookies.Add(cookie); 

... dostaniesz podstawową wersję tego, czego potrzebujesz.

UWAGA: Nie przetestowałem tego kodu.

+0

Dave, twoje rozwiązanie zadziałało dla mnie. Ale robienie tego tylko nie jest wystarczające. Musiałem dodać linię kodu, aby pamiętać ją przez co najmniej rok. Napisałem poniżej. – nccsbim071

+0

Dzięki, właśnie zaktualizowałem. –

+0

Dzięki, rozwiąż mój problem !! –

1

To nie jest problem, jest to cecha :) sesja

użytkownika nie upłynął jeszcze tak, nawet jeśli zamknąć i ponownie otworzyć przeglądarkę, plik cookie jest nadal dobra.

To wygaśnięcie pliku cookie unieważnia sesję użytkownika.

+0

dzięki kervin, masz rację. To oczyściło jedną z moich wątpliwości. – nccsbim071

4

Kevin i Dave, chłopaki, rock, stary.

Dave, oprócz twojego kodu musiałem dodać jeszcze jedną linię, aby działało. Chodzi o to, żeby to pamiętać przez co najmniej rok. Musiałem przypisać wartość do cookie.Expires oprócz kodu, aby działało. Jeśli ten plik cookie.Expires nie zostanie ustawiony, plik cookie zostanie utracony po ponownym uruchomieniu komputera, co mam na myśli pod koniec sesji. Zauważyłem to w FireFox. Przejrzałem szczegóły pliku cookie i znalazłem: Jeśli plik cookie.Expires nie jest ustawiony, wartością atrybutu "Wygasa:" w przeglądarce Firefox jest "Pod koniec sesji", ale jeśli ustawiono opcję cookie.Expires, to wartość "Wygasa" : "atrybut w Firefoksie odnosi się do daty i godziny ustawiono wartość cookie.Expires.

Oto kod:

int timeout = createPersistentCookie ? 525600 : 2; // Timeout in minutes,525600 = 365 days 
var ticket = new FormsAuthenticationTicket(userName,createPersistentCookie,timeout);    
string encrypted = FormsAuthentication.Encrypt(ticket); 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted); 
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);//My Line 
HttpContext.Current.Response.Cookies.Add(cookie); 

Dziękuję wam, że było naprawdę świetne rozwiązanie.

0

Miałem zaimplementowane to samo i kiedy testowałem to działa dobrze w Mozila, ale nie działa w IE8 dla wszystkich komputerów, miałem również zaktualizowane ustawienie do akceptowania ciasteczek w IE, ale nadal nie działa.

Internet Explorer 8.x

  1. Kliknij Tools-menu.
  2. Wybierz Opcje internetowe w menu - otworzy się nowe okno.
  3. Kliknij kartę Prywatność u góry okna.
  4. Kliknij przycisk Domyślne okna.
  5. Przesuń suwak, aby znalazł się na jednym z poziomów poniżej Medium High (w tym Medium, Low, Accept All Cookies).
  6. Zapisz zmiany, klikając przycisk OK.
  7. Powinieneś teraz móc dodawać produkty do swojego koszyka.
4

Wystarczy krótka notka na temat korzystania z biletu uwierzytelnienia członkostwa we wspólnym środowisku dla każdego, kto może wylądować tutaj z tym problemem. Mam stronę mvc runnig w godaddy i miałem kłopoty z zapamiętaniem mnie. Było to rozwiązanie:

<system.web> 
<machineKey 
    validationKey="4C6404A3B305CD6E8CFEAC258F042FB95E45E9C3C2CEC3AAB838996CFBE661E41DF1A1BAC75B9B45E02147612FD9B71CA74DDA50B0D0D6ED11F0BB8E31048953" 
    decryptionKey="BC471CF17A97B08A9DF85C7B502AD95680E3BE4418FD9C6CEA57E7F97ED64291" 
    validation="SHA1" decryption="AES" 
/> 

dzięki: http://www.geekfreeq.com/aspnet-remember-me-option-forms-authentication-not-working/

+0

To łącze jest teraz najwyraźniej w kopii zapasowej. – ventaur

+3

Możesz również utworzyć te ustawienia tutaj http://aspnetresources.com/tools/machineKey – Gluip