it-swarm.com.de

ASP.Net Benutzerdaten in Auth Cookie speichern

Ich möchte einige Daten wie den Benutzernamen und die Benutzer-ID (Tabellenprimärschlüssel) im Benutzerdatenabschnitt des Auth-Cookies speichern. Der Grund, warum ich dies tue, ist, diese Daten beizubehalten, wenn der Browser geschlossen ist, ohne dass der Benutzer neu anmelden muss.

Bearbeiten : Whoops! Mir wurde klar, dass ich mich nicht gut erklärt hatte. Ich versuche nicht, einen Benutzer anhand seines Cookies zu authentifizieren. Der Benutzer ist bereits durch das ASP.Net-Mitgliedschaftssystem authentifiziert - dieser Teil ist in Ordnung. Mein Problem ist, wenn ich zum Beispiel den Spitznamen des Benutzers anzeigen möchte, muss ich eine andere SQL-Abfrage auslösen und diese dann in der Sitzung speichern. Ich dachte, es wäre sinnvoll, diese Informationen in dem Auth-Cookie (wieder in dem bereits von ASP.Net erstellten) im UserData-Abschnitt zu speichern, der zu diesem Zweck erstellt wurde.

Ich möchte keine Profile verwenden, da ich eine eigene Benutzertabelle mit Profildaten habe und eine leichtgewichtige Lösung brauchte.

Was ist ein guter Weg, um diese Daten im Benutzerdatenabschnitt des Auth-Cookies zu codieren? Ich dachte an die Serialisierung, aber das könnte übertrieben sein. Mache ich das falsch?

26
Donnie Thomas

Ich habe hier eine ausführliche Anleitung dazu geschrieben:

http://www.danharman.net/2011/07/07/storing-custom-data-in-forms-authentication-tickets/

Dadurch wird die Verschlüsselung und Authentifizierung aufrechterhalten und mit json wird eine Klasse in das UserData-Feld serialisiert.

Bearbeiten:

Der Blog existiert nicht mehr, ein Archiv ist im Webarchiv hier .

Zusammenfassung aus dem Blog:

Holen Sie sich das vorhandene Cookie und das Auth Ticket

HttpResponse response = HttpContext.Current.Response;
bool rememberMe = true;
var cookie = FormsAuthentication.GetAuthCookie(name, rememberMe);
var ticket = FormsAuthentication.Decrypt(cookie.Value);

Definieren Sie Ihre benutzerdefinierten Daten (stellen Sie sicher, dass diese für Json serialisierbar sind).

var userData = new YourUserClass(...);

Erstellen Sie ein neues Auth Ticket mit Ihren Daten und den vorhandenen Auth Ticket-Einstellungen

var newTicket = new FormsAuthenticationTicket(ticket.Version, 
    ticket.Name, 
    ticket.IssueDate, 
    ticket.Expiration, 
    ticket.IsPersistent, 
    userData.ToJson(), //This is where you'd set your user data
    ticket.CookiePath);
var encTicket = FormsAuthentication.Encrypt(newTicket);

Setzen Sie Ihr individuelles Ticket in ein Cookie und fügen Sie es zur Antwort hinzu

cookie.Value = encTicket;
response.Cookies.Add(cookie);
36
DanH

Offenbar war ich auf dem richtigen Weg: http://www.asp.net/learn/security/tutorial-03-vb.aspx (Schritt 4: Schritt 4: Zusätzliche Benutzerdaten im Ticket speichern)

10
Donnie Thomas

Wenn Sie bereits eine Benutzertabelle mit Profilinformationen haben, können Sie sich nicht mit einem benutzerdefinierten Profilanbieter verbinden.

Wenn Sie ein anderes Beispiel für die Implementierung eines solchen Beispiels wünschen, können Sie einen Blick auf den SQL Table Profile Provider werfen.

3

Ja. Wenn Sie die Benutzer-ID und das Login in dem Cookie speichern, was hindert jemand daran, seine Cookies in die Benutzer-ID und das Login eines anderen zu ändern?

Sie müssen ein Auth-Ticketsystem einrichten. Grundsätzlich handelt es sich um einen Cookie-Wert, der überprüft wird, wenn keine Sitzung vorhanden ist. Wenn ein Wert vorhanden ist, führen Sie ihn gegen eine Ticket-Tabelle aus, die ihre Benutzer-ID enthalten sollte. Wenn Sie das Ticket finden, geben Sie ihnen eine Sitzung und ein neues Ticket .

3
Spencer Ruport

Vielleicht könnten Sie einfach einen weiteren Cookie erstellen ... Ich persönlich würde mich nicht mit dem Auth Cookie beschäftigen.

2
Eric Nicholson

Das Speichern zusätzlicher Benutzerdaten im Cookie bedeutet ein größeres Cookie, das bei jeder Anforderung vom Client hin und her gesendet wird.

Ein besserer Ansatz, um die zusätzlichen Datenbank-Treffer zu vermeiden, die Sie befürchten, besteht darin, diese Daten im Speicher nach der Anmeldung des Benutzers zwischenzuspeichern.

ASP.NET verfügt über einen HttpContext.Current.Items-Cache pro Anforderung und einen HttpContext.Current.Cache für eine Anwendungsdomäne. Ich denke, Sie suchen in dieser Instanz nach HttpContext.Current.Cache.

Wenn Sie die Zwischenspeicherung zwischen Webservern (Lastausgleichsservern) benötigen, können Sie alternativ dazu auch die wichtigsten Wertespeicher von Drittanbietern wie Memcached, Redis, Velocity, Ncache usw. betrachten.

0
Steven Quick