web-dev-qa-db-fra.com

Données utilisateur de magasin ASP.Net dans le cookie d'authentification

Je souhaite stocker des données telles que le pseudo et l'ID utilisateur (clé primaire de la table) dans la section des données utilisateur du cookie d'authentification. La raison pour laquelle je le fais est pour conserver ces données lorsque le navigateur est fermé, sans que l'utilisateur se reconnecte.

Edit : Oups! J'ai réalisé que je ne m'étais pas bien expliqué. Je n'essaie pas de réauthentifier un utilisateur en fonction de son cookie. L'utilisateur est déjà authentifié par le système d'adhésion d'ASP.Net - cette partie est correcte. Mon problème est que si je veux montrer le surnom de l'utilisateur, par exemple, je dois lancer une autre requête SQL, puis la stocker dans la session. J'ai pensé qu'il serait logique de stocker ces informations dans le cookie d'authentification (encore une fois, celui déjà créé par ASP.Net) dans la section UserData, qui semble avoir été créée à cet effet.

Je ne souhaite pas utiliser de profils car j'ai ma propre table d'utilisateurs contenant des données de profil et j'avais besoin d'une solution légère.

Quel est un bon moyen d'encoder ces données dans la section des données utilisateur du cookie d'authentification? Je pensais à la sérialisation, mais c'est peut-être exagéré. Est-ce que je m'y prends mal?

26
Donnie Thomas

J'ai écrit un tutoriel détaillé sur la procédure à suivre ici:

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

Cela maintient le cryptage et l'authentification et utilise json pour sérialiser une classe dans le champ UserData.

Modifier:

Le blog n'existe plus, il est possible de trouver une archive sur l'archive Web ici .

Résumé du blog:

Obtenir le cookie existant et le ticket d'authentification

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

Définissez vos données personnalisées (assurez-vous qu'elles sont sérialisables en json)

var userData = new YourUserClass(...);

Créer un nouveau ticket d'authentification avec vos données et les paramètres de ticket d'authentification existants

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

Définissez votre ticket personnalisé dans un cookie et ajoutez-le à la réponse

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

Apparemment, j'étais sur la bonne voie: http://www.asp.net/learn/security/tutorial-03-vb.aspx (Étape 4: Étape 4: Stockage de données utilisateur supplémentaires dans le ticket)

10
Donnie Thomas

Si vous avez déjà une table utilisateur contenant des informations de profil, pourquoi ne pas la connecter avec un fournisseur de profil personnalisé .

Si vous souhaitez un autre exemple d'implémentation de ce type, consultez le Fournisseur de profil de table SQL

3
Zhaph - Ben Duguid

Oui. Si vous stockez l'ID utilisateur et la connexion dans le cookie, qu'est-ce qui empêche quelqu'un de changer ses cookies en identifiant et connexion d'utilisateur?

Vous devez configurer un système de ticket d'authentification. Fondamentalement, c'est une valeur de cookie qui est vérifiée lorsqu'aucune session n'existe. Si une valeur est présente, vous l'exécutez sur une table de tickets qui devrait contenir son ID utilisateur. Si vous trouvez le ticket, donnez-leur une session et un nouveau ticket .

3
Spencer Ruport

Peut-être que vous pourriez simplement créer un autre cookie ... Personnellement, je ne voudrais pas jouer avec le cookie d'authentification.

2
Eric Nicholson

Stocker des données utilisateur supplémentaires dans le cookie signifie un cookie plus volumineux envoyé par le client avec chaque demande.

Une meilleure approche pour éviter les accès supplémentaires à la base de données qui vous inquiètent consiste à mettre en cache ces données en mémoire après la connexion de l'utilisateur.

ASP.NET a un cache par requête HttpContext.Current.Items et un cache de domaine d'applications HttpContext.Current.Cache, je pense que vous recherchez HttpContext.Current.Cache dans cet exemple.

Si vous avez également besoin de la mise en cache sur des serveurs Web (serveurs Web à charge équilibrée), vous pouvez également consulter des magasins de valeurs de clés tierces, tels que memcached, redis, velocity, ncache, etc.

0
Steven Quick