2011-04-10 3 views
3

Dans ma page web j'utiliser FormsAuthenticationOù dois-je stocker "MemberID"?

FormsAuthentication.RedirectFromLoginPage(VisitorEmail, False) 

Chaque fois que le visiteur est authentifié via la page de connexion, je mets le

Session("MemberID") = GetMemberIDByEmail(VisitorEmail) pour un traitement ultérieur. J'ai besoin des deux MemberID et VisitorEmail. Mais quelque chose me dit que c'est "hors du livre" et non "par le livre".

Alors, est-ce que je fais quelque chose de MAUVAIS ou de MAUVAIS ici?

+1

Je ne suis pas sûr que ce n'est pas "par le livre" ou quoi que ce soit. Si vous avez besoin d'un identifiant et d'un e-mail, vous avez besoin des deux, et vous devez les conserver quelque part, avec tous les coûts associés. Vous devriez probablement repenser votre logique pour voir si vous pouvez faire disparaître juste l'email - puisque les deux sont uniques et un mappage direct d'un-un, en théorie vous devriez seulement devoir en garder un. –

Répondre

3

Il est bon d'utiliser Session pour mettre en cache ce type d'informations, mais n'oubliez pas de le réaffecter lorsque la session expire dans Global.asax:

void Session_Start(object sender, EventArgs e) 
{ 
    if(Request.IsAuthenticated) //to make sure the user has not logged out 
     Session["MemberID"] = GetMemberIDByEmail(VisitorEmail); 
} 
1

Vous pouvez créer une classe principale personnalisée afin de pouvoir ajouter les propriétés supplémentaires. Puis modifiez votre Global.asax pour remplacer Application_PostAuthenticateRequest avec votre code et également définir Context.User = Thread.CurrentPrincipal = myPrincipal;. Le mieux est de toujours définir Thread.CurrentPrincipal, mais normalement vous pouvez également accéder à vos propres propriétés ailleurs dans votre code en utilisant le plus "pratique" Page.User ou Context.User.


4

Désolé, je ne sais pas exactement ce que vous essayez de faire de votre description, mais il n'y a pas besoin de stocker les MemberID en état de session. Chaque fois que vous en avez besoin, il suffit d'appeler:

Membership.GetUser.ProviderUserKey

Note: Sa bonne forme pas vraiment considéré pour stocker des informations dans l'état de session car cela pourrait être perdu par exemple si le serveur Web se réinitialise - ce qu'il fait périodiquement, ou si le site doit être recompilé. En outre, ce n'est pas très évolutif car chaque utilisateur "actif" utilisera de la mémoire et si vous avez besoin de passer à un état de session de ferme Web, cela peut causer des problèmes car il sera différent sur chaque serveur web.

Prob OK pour un peu, le site rapide si ;-)

+1

Quoi? C'est bien d'utiliser la session. C'est ce qu'il y a là-bas. Si vous utilisez une batterie de serveurs Web, configurez simplement vos états de session pour qu'ils soient stockés dans SQL Server au lieu d'utiliser la gestion de session InProc par défaut. Cela réglera aussi les problèmes de compilation si vous vous inquiétez pour eux. [Voir ici pour un howTo.] (Http://support.microsoft.com/kb/317604) –

+0

Je devrais ajouter, en ce qui concerne la question initiale, Membership.GetUser.ProviderUserKey est ce que je ferais, aussi. ;) –

+0

Merci Charlie - oui, peut-être que j'étais un peu trop prudent sur l'utilisation de l'état de session. C'est bien pour les données transitoires, je suppose, et oui le bousculer dans la DB est une possibilité - mais c'est bien si vous pouvez simplement l'éviter ce que je pense est possible dans ce cas (praps juste ma propre expérience amère!) – PapillonUK

0

Ne pourriez-vous passer les deux autour et stocker l'ID de membre dans la forme variable (puisque je suppose que l'utilisateur est en mesure de changer il adresse e-mail et pas là id membre) ...

Dim memberId as Integer = GetMemberIDByEmail(VisitorEmail) 
' assuming integer here and that a result is found etc etc 

' set the form authentication stuff 
FormsAuthentication.RedirectFromLoginPage(memberId, False) 

Et vous pouvez toujours regarder l'adresse e-mail du MemberID (mettre en cache peut-être contre l'ID membre dans les requêtes)

Public Function GetMemberEmail(Byval memberId as Integer) As String 

    Dim cacheKey as String = "member-email-" & memberId 
    Dim email as String 
    If Cache.Item(cacheKey) is Nothing Then 
     email = GetMemberEmailByID(memberId) 
     Cache.Insert(cacheKey, email ... 
    Else 
     email = Cache.Item(cacheKey) 
    End If 
    return email 

End Function 

Si vous avez besoin des deux informations et que l'identifiant est moins susceptible de changer, il semblerait que la meilleure valeur soit utilisée pour l'authentification de vos formulaires .... et vous pouvez toujours rechercher l'adresse e-mail à partir de la valeur.