2010-03-16 16 views
12

Nachdem ich viel gesucht habe, habe ich keine Antworten bekommen und musste mich endlich an Sie wenden. Im Folgenden erkläre ich mein Problem im Detail. Es ist zu lang, also hör bitte nicht auf zu lesen. Ich habe mein Problem in einfacher Sprache erklärt.ASP.NET MVC RememberMe

Ich habe ein asp.net mvc-Projekt entwickelt. Ich verwende Standard-ASP.NET-Rollen und Mitgliedschaft. Alles funktioniert gut, aber die Remember Me-Funktion funktioniert überhaupt nicht. Ich listet alle Details der Arbeit auf. Ich hoffe, ihr könnt mir helfen, dieses Problem zu lösen.

Ich brauche einfach:

ich Benutzer müssen Web-Anwendung anzumelden. Bei der Anmeldung können sie sich entweder einloggen oder sich an mich erinnern. Wenn sich der Benutzer mit remember me anmeldet, möchte ich, dass der Browser sich lange Zeit an sie erinnert, sagen wir mindestens ein Jahr oder eine sehr lange Zeit. So wie sie es tun in www.dotnetspider.com, www.codeproject.com, www.daniweb.com und vielen anderen Seiten. Wenn sich ein Benutzer anmeldet, ohne sich an mich zu erinnern, sollte der Browser den Zugriff auf die Website für ca. 20-30 Minuten erlauben und danach sollte seine Sitzung ablaufen. Ihre Sitzung sollte ebenfalls ablaufen, wenn sich der Benutzer anmeldet und den Browser herunterfährt, ohne sich abzumelden.

Hinweis: Ich habe die obige Funktionalität erfolgreich implementiert, ohne die standardmäßigen asp.net Rollen und Mitgliedschaften zu verwenden, indem ich meine eigenen talbes für den Benutzer und die Authentifizierung mit meiner Datenbanktabelle, dem Setzen von Cookies und Sitzungen in meinen anderen Projekten erstelle. Aber für dieses Projekt haben wir von Anfang an Standardasp.net-Rollen und Mitgliedschaften verwendet. Wir dachten, es wird funktionieren und nachdem alles zum Zeitpunkt des Tests erstellt wurde, hat es einfach nicht funktioniert. und jetzt können wir die vorhandene Funktionalität nicht durch Standard-asp.net-Rollen und Mitgliedschaft durch meine eigenen benutzerdefinierten Benutzertabellen und all das Zeug ersetzen, Sie verstehen, worüber ich tale.

Entweder gibt es eine Art von Bug mit Standard-asp.net Rollen und Mitgliedschaft Funktionalität oder ich habe das ganze Konzept der Standard-asp.net Rollen und Mitgliedschaft falsch. Ich habe angegeben, was ich oben möchte. Ich denke, es ist sehr einfach und vernünftig.

Was ich tat

  1. Login-Formular mit Benutzername, Passwort und erinnere mich Feld.
  2. Meine Einstellung in web.config:

    < authentication mode = "Forms" >
    < Formen loginUrl = "~/Account/logon" timeout = "2880"/>
    </Authentifizierung >

  3. in Meine Controller-Aktion, ich habe dies:

    FormsAuth.SignIn (userName, rememberMe);

    public void SignIn (Zeichenfolge userName, bool createPersistentCookie) { FormsAuthentication.SetAuthCookie (Benutzername, createPersistentCookie); }

Nun sind die Probleme folgende:

ich bereits in Abschnitt oben gesagt haben: "Ich brauche einfach diese". Benutzer kann sich erfolgreich am System anmelden. Ihre Sitzung existiert für so viele Minuten wie in timeout in web.config angegeben. Ich habe auch ein Beispiel meiner web.config gegeben. In meinem Beispiel, wenn ich das Timeout auf 5 Minuten eingestellt habe, läuft die Benutzersitzung nach 5 Minuten ab, das ist in Ordnung. Wenn der Benutzer jedoch den Browser schließt und den Browser erneut öffnet, kann der Benutzer die Website weiterhin betreten, ohne sich einzuloggen, bis die in "Zeitüberschreitung" angegebene Zeit nicht abgelaufen ist. Das gleitende Ablaufdatum für den Zeitüberschreitungswert funktioniert ebenfalls. Wenn sich der Benutzer nun bei dem System anmeldet, bei dem sich die Option "Angemeldet bleiben" aktiviert hat, läuft die Benutzersitzung nach 5 Minuten noch ab. Das ist kein gutes Verhalten, oder? Ich möchte damit sagen, dass, wenn sich der Benutzer bei dem System anmeldet, dass er sich erinnert, er für eine lange Zeit in Erinnerung bleiben sollte, bis er sich nicht vom System abmeldet oder der Benutzer nicht manuell alle Cookies vom Browser löscht. Wenn sich ein Benutzer am System anmeldet, ohne sich zu erinnern, hat er überprüft, dass seine Sitzung nach den in web.config festgelegten Werten für die Zeitüberschreitung und auch nach dem Schließen des Browsers ablaufen sollte. Das Problem ist, dass wenn der Benutzer den Browser schließt und ihn wieder öffnet, er die Website immer noch betreten kann, ohne sich anzumelden.

Ich suche das Internet viel zu diesem Thema, aber ich konnte die Lösung nicht finden. Im Blogbeitrag (http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx) von Scott Gu zum genau gleichen Thema. Die Benutzer beschweren sich über das Gleiche in ihren Kommentaren, aber es gibt keine einfache Lösung, die von Mr. Scott gegeben wird.

Ich las es an folgenden Orten: http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx http://geekswithblogs.net/vivek/archive/2006/09/14/91191.aspx

Ich denke, das Problem der viel von Benutzern ist. Wie aus einem Blogbeitrag von Mr. Scott Gu hervorgeht.

Ihre Hilfe wird sehr geschätzt. Vielen Dank im Voraus.

+1

Sorry, TLDR. :) – kervin

+1

Sie haben Recht. Deine Frage ist zu lang. Du solltest es kürzer machen. –

+0

Übrigens, es ist Mr. Scott Guthrie alias The Gu. –

Antwort

26

Was Sie tun möchten, ist ein anderes Timeout, wenn die RememberMe Option aktiviert ist, als wenn es deaktiviert ist. Leider erlaubt es die SetAuthCookie-Methode nicht, das Ablaufdatum manuell festzulegen, also müssen Sie das selbst tun.

Das Problem ist dann, wie man das macht?

ASP.NET MVC verwendet die FormsAuthentication-Klasse von System.Web.Security, um dies zu tun, weil es nicht trivial ist, wenn Sie auch die Konfigurationseinstellungen und cookeless Browsing und SSL unterstützen möchten, aber ich denke, dass wenn Sie dies tun :

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); 

... Sie erhalten eine Basisversion von dem, was Sie brauchen.

HINWEIS: Ich habe diesen Code nicht getestet.

+0

Dave, deine Lösung hat für mich funktioniert. Aber nur das zu tun ist nicht ausreichend. Ich musste eine Zeile Code hinzufügen, um es für mindestens ein Jahr zu erinnern. Ich habe unten geschrieben. – nccsbim071

+0

Danke, ich habe gerade aktualisiert. –

+0

Danke, löse mein Problem !! –

1

das kein Problem, es ist ein Merkmal :)

Die Sitzung des Benutzers noch nicht so abgelaufen ist, auch wenn sie den Browser schließen und wieder öffnen, das Cookie ist immer noch gut.

Es ist der Ablauf des Cookies, der die Sitzung des Benutzers ungültig macht.

+0

danke kervin, du hast recht. Dies löste einen meiner Zweifel. – nccsbim071

4

Kevin und Dave, ihr Jungs, Rock, Mann.

Dave, zusätzlich zu Ihrem Code musste ich noch eine Zeile hinzufügen, damit es funktioniert. Ich möchte es für mindestens ein Jahr erinnern. Ich musste cookie.Wire Wert zuweisen, zusätzlich zu Ihrem Code, damit es funktioniert. Wenn diese Zeile cookie.Expires nicht gesetzt ist, geht der Cookie nach dem Neustart des Rechners verloren, also am Ende der Sitzung. Das habe ich in FireFox gemerkt. Ich ging durch die Details von Cookie und ich fand: Wenn cookie.Expires nicht gesetzt ist, dann ist der Wert für "Expires:" -Attribut in Firefox "Am Ende der Sitzung", aber wenn cookie.Expires gesetzt ist, dann ist der Wert für "Läuft ab : "Attribut in Firefox ist das Datum, zu dem der Wert von cookie.Expires gesetzt wurde. Hier

ist der Code:

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); 

Danke Jungs, das war wirklich eine großartige Lösung.

0

Ich hatte die gleiche Sache implementiert und wenn ich es testen, funktioniert es gut in Mozila, aber nicht in IE8 für alle PCs funktioniert, ich hatte auch die Einstellung auf Cookies in IE akzeptieren, aber immer noch nicht funktioniert.

Internet Explorer 8.x

  1. Klicken Sie auf das Extras-Menü.
  2. Wählen Sie Internetoptionen im Menü - ein neues Fenster öffnet sich.
  3. Klicken Sie auf die Registerkarte Datenschutz oben im Fenster.
  4. Klicken Sie auf die Schaltfläche Standard des Fensters.
  5. Verschieben Sie den Schieberegler so, dass er sich auf einer der Ebenen unter Mittel Hoch (einschließlich Mittel, Niedrig, Alle Cookies akzeptieren) befindet.
  6. Speichern Sie die Änderungen, indem Sie auf OK klicken.
  7. Sie sollten jetzt Artikel in Ihren Einkaufswagen legen können.
4

Nur eine kurze Anmerkung über die Verwendung der Mitgliedschaft Auth Ticket in einer gemeinsamen Umgebung für alle, die hier mit diesem Problem landen können. Ich habe eine MVC-Site bei Godaddy laufen und hatte Schwierigkeiten mit mir zu erinnern. Das war die Lösung:

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

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

+0

Dieser Link ist jetzt anscheinend wieder gesichert. – ventaur

+3

Sie können diese Einstellungen auch hier erstellen http://aspnetresources.com/tools/machineKey – Gluip