2010-11-18 4 views
1

J'ai créé un fournisseur d'appartenances personnalisé et il est plus pratique pour moi d'opérer sur MembershipUser.ProviderUserKey plutôt que sur UserName. Donc, pour récupérer ProviderUserKey j'effectuer un tel code:ASP.NET User.Identity.Name alternative?

if (User.Identity.IsAuthenticated) 
{ 
    int UserID = (int)Membership.GetUser(User.Identity.Name).ProviderUserKey; 
} 

Cependant, lorsque la méthode GetUser() est exécutée, les données utilisateur doivent être extraites de la base de données et cela est me casser les pieds. C'est gaspillage inutile de temps de serveur, peu importe combien de temps cette fois est, je voudrais l'éviter.

Y at-il un autre moyen d'obtenir ProviderUserKey d'une manière plus pratique, comme dans User.Identity.Name cas?

Je voudrais entendre vos idées. Comment résolvez-vous ce problème sur vos pages Web?

Merci.

Répondre

5

L'API Membership atteint la base de données car c'est le seul endroit où cette information est stockée. User.Identity.Name récupère le nom d'utilisateur connecté à partir d'un cookie qui est envoyé à chaque demande. Vous pouvez implémenter un mandant générique personnalisé et stocker les informations nécessaires dans la partie userData du ticket d'authentification qui est cryptée dans le cookie. Voici un article qui couvre ce sujet.

+0

Merci, pourriez-vous me signaler quelques informations pertinentes sur la façon de procéder? Tout ce que j'ai trouvé concerne. NET 1.1 et je voudrais le faire dans la version 3.5 du framework. – Wodzu

+0

Voici [un article] (http://www.xoc.net/works/tips/forms-authentication.asp) qui illustre comment utiliser GenericPrincipal et stocker des informations supplémentaires dans le cookie. L'idée est de remplacer HttpContext.Current.User par cette entité personnalisée afin qu'elle soit accessible partout. –

+0

Merci, mais pour autant que je sache, cet exemple est basé sur la création de contrôles propres loign. Je devrais remplacer le comportement standard ... Que faire si j'utilise les contrôles de connexion standard. Est-ce que je ne peux pas étendre une classe pour exposer une propriété de plus pour la renvoyer plus tard dans mon application de manière pratique? – Wodzu

3

Lire ProviderUserKey de la base de données lors de leur première connexion et de le stocker dans la collection de sessions de l'utilisateur? Sur les demandes suivantes, vous pouvez simplement le récupérer depuis la session sans aller à la base de données.

+0

Je pensais à la même chose mais une façon plus élégante serait de prolonger en quelque sorte la classe d'identité ... – Wodzu

+0

Le problème avec l'extension de la classe Identity est que vous n'avez aucun moyen de faire en sorte que l'utilisateur ait votre classe d'identité à la place de la sienne. alors vous devrez créer votre propre IPrincipal. À ce stade, vous devez considérer que les problèmes potentiels avec tout ce code personnalisé l'emportent sur le très faible gain de performance. – Greg

Questions connexes