ASP.NET MVC

Po wielu poszukiwaniach nie dostałem żadnych odpowiedzi i w końcu musiałem oddzwonić. Poniżej wyjaśniam szczegółowo mój problem. Jest za długa, więc nie przestawaj czytać. Wyjaśniłem swój problem prostym językiem.

Opracowuję asp.net projekt mvc. Używam standard ASP.NET role i członkostwo. Wszystko działa dobrze, ale funkcja Zapamiętaj mnie w ogóle nie działa. Wymieniam wszystkie szczegóły pracy. Mam nadzieję, że pomożecie mi rozwiązać ten problem.

Po prostu potrzebuję tego:

Potrzebuję użytkownika do zalogowania się do aplikacji webowej. Podczas logowania mogą się zalogować za pomocą remember me lub bez niego. Jeśli użytkownik loguje się za pomocą remember me, chcę, aby przeglądarka zapamiętała je na długo, powiedzmy co najmniej rok lub znacznie długo. Sposób w jaki to robią w www.dotnetspider.com,www.codeproject.com,www.daniweb.com i wiele innych stron. Jeśli użytkownik loguje się bez zapamiętania mnie, to przeglądarka powinna zezwolić na dostęp do strony dla około 20-30 minut, a po tym ich sesja powinna wygasnąć. Ich sesja powinna również wygasnąć, gdy użytkownik zaloguje się i wyłączy przeglądarkę bez wylogowania.

Uwaga: udało mi się zaimplementować powyższą funkcjonalność bez użycia standardowych asp.net role i członkostwo poprzez tworzenie własnych talbes dla użytkownika i uwierzytelnianie w oparciu o tabelę bazy danych, ustawianie plików cookie i sesji w innych moich projektach. Ale do tego projektu Od początku używaliśmy standardowego asp.net role i członkostwo. Myśleliśmy, że będzie działać i po tym, jak wszystko zostało zbudowane w czasie testowania po prostu nie działa. a teraz nie możemy zastąpić istniejącej funkcjonalności standardowym asp.net role i członkostwo z moimi własnymi niestandardowymi tabelami użytkowników i wszystkimi tymi rzeczami, rozumiesz, o czym mówię.

Albo Jest jakiś bug ze standardowym asp.net role i funkcjonalność członkostwa lub mam całą koncepcję standardu asp.net role i członkostwo źle. I have said what i want powyżej. Myślę, że to bardzo proste i rozsądne.

Co zrobiłem

  1. formularz logowania z nazwą użytkownika, hasłem i polem Zapamiętaj mnie.
  2. moje ustawienie w sieci.config:





  3. W mojej akcji kontrolera mam to:

    FormsAuth.SignIn(userName, rememberMe);

    Public void SignIn(string userName, bool createPersistentCookie) { FormsAuthentication.SetAuthCookie(nazwa użytkownika, createPersistentCookie); }

Teraz problemy są następujące:

Napisałem już w powyższej sekcji "po prostu tego potrzebuję". użytkownik może z powodzeniem zalogować się do systemu. Ich sesja trwa tyle minut, ile jest określona w wartości timeout w web.config. Podałem również próbkę mojej sieci.config. W moim samplem jeśli ustawiłem timeout na 5 minut, to sesja użytkownika wygasa po 5 minuty, w porządku. Ale jeśli użytkownik zamknie przeglądarkę i ponownie ją otworzy, użytkownik może wejść na stronę bez logowania, dopóki czas określony w" timeout " nie upłynie. Przesuwne wygaśnięcie dla wartości timeout działa również dobrze. Teraz, jeśli użytkownik loguje się do systemu z zaznaczonym remember me, sesja użytkownika nadal wygasa po 5 minutach. To nie jest dobre zachowanie, prawda?. Chodzi mi o to, że jeśli użytkownik loguje się do systemu z zaznaczonym remember me powinien być zapamiętany na długo 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 zaznaczonego remember me, jego sesja powinna wygasnąć po upływie określonego w web okresu czasu.config, a także jeśli użytkownicy zamkną przeglądarkę. Problem polega na tym, że jeśli użytkownik zamknie przeglądarkę i otworzy ją ponownie, nadal może wejść na stronę bez logowania.

Często przeszukuję internet w tym temacie, ale nie udało mi się znaleźć rozwiązania. Na blogu post ( http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx ) wykonane przez Scotta Gu dokładnie na ten sam temat. Użytkownicy narzekają na to samo w swoich komentarzach ut nie ma łatwego rozwiązania podanego przez Pana Scotta.

Przeczytałem 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

To chyba problem wielu użytkowników. Jak wygląda z wpisu na blogu autorstwa Pana Scotta Gu.

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

Author: animuson, 2010-03-16

5 answers

To, co chcesz zrobić, to mieć inny limit czasu, gdy opcja RememberMe jest zaznaczona, niż gdy nie jest zaznaczona. Niestety, metoda SetAuthCookie nie pozwala na ręczne ustawienie wygaśnięcia, więc musisz to zrobić sam.

Problem w tym, jak to zrobić?

ASP.NET MVC używa klasy FormsAuthentication systemu.Www.Bezpieczeństwa, bo nie jest to trywialne, jeśli chcesz również obsługiwać ustawienia konfiguracyjne i przeglądanie plików cookieless i 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);

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

Uwaga: nie testowałem tego kodu.

 26
Author: Dave Van den Eynde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-27 02:59:29

Kevin i Dave, rządzicie.

Dave, oprócz Twojego kodu musiałem dodać jeszcze jedną linijkę, żeby zadziałało. Chcę, żeby pamiętała przynajmniej rok. Musiałem przypisać wartość do cookie.Wygasa oprócz kodu, aby działał. Jeśli ta linia cookie.Expires nie jest ustawiony plik cookie jest tracony po ponownym uruchomieniu komputera mam na myśli koniec sesji. Zauważyłem to w Firefoksie. Przejrzałem szczegóły cookie i znalazłem: jeśli cookie.Expires nie jest ustawiona wtedy wartość dla "Expires:" atrybut w Firefoksie jest "na końcu sesji", ale jeśli cookie.Expires jest ustawiana wtedy wartość atrybutu" Expires: "w Firefoksie jest datetime ciasteczko.Została ustawiona wartość 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, to było naprawdę świetne rozwiązanie.

 4
Author: nccsbim071,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 11:29:03

Tylko krótka notka o korzystaniu z członkostwa auth ticket 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 problemy z Zapamiętaj 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/

 4
Author: BillB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-04 19:51:40

To nie problem, to funkcja:)

Sesja użytkownika jeszcze nie wygasła, więc nawet jeśli zamkną i ponownie otworzą przeglądarkę, plik cookie nadal jest dobry.

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

 1
Author: kervin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 07:45:44

Zaimplementowałem to samo i kiedy testuję to działa dobrze w Mozili, ale nie działa w IE8 na wszystkich komputerach, miałem również zaktualizowane ustawienie, aby akceptować ciasteczka w IE, ale nadal nie działa.

Internet Explorer 8.x

  1. Kliknij na menu Narzędzia.
  2. Wybierz z menu Opcje internetowe - otworzy się nowe okno.
  3. Kliknij kartę Prywatność w górnej części okna.
  4. Kliknij na domyślny przycisk okna.
  5. przesuń suwak tak, aby był na jednym z poziomów poniżej średniej Wysokiej(w tym Średni, Niski, Akceptuj wszystkie pliki cookie).
  6. Zapisz zmiany klikając OK.
  7. powinieneś być w stanie dodać produkty do koszyka teraz.
 0
Author: adsolanki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-19 09:29:29