1

Je souhaite exécuter la ligne ci-dessous lorsque l'utilisateur se connecte pour avoir accès à l'objet MembershipUser. Cependant, j'ai du mal à déterminer quand le régler.ASP.NET MVC, Authentification par formulaire et session

Session["User"] = Membership.GetUser(); 

Jusqu'à présent, je l'ai essayé ...

  • Application_AcquireRequestState
  • Application_BeginRequest
  • FormsAuthentication_OnAuthenticate

Pour chaque l'état de session est pas nécessairement disponible.

Il est facile de l'appeler manuellement dans la page d'ouverture de session, mais je dois l'utiliser lorsque je me connecte automatiquement à l'aide de cookies.

Répondre

3

Si tout ce que vous voulez faire est de stocker des données arbitraires ainsi que le nom d'utilisateur, il y a un projet open source appelé FormsAuthenticationExtensions qui vous permet de faire exactement cela d'une manière très simple:

Dans votre action Connexion vous stockerait vos données comme ceci:

var ticketData = new NameValueCollection 
{ 
    { "name", user.FullName }, 
    { "emailAddress", user.EmailAddress } 
}; 
new FormsAuthentication().SetAuthCookie(user.UserId, true, ticketData); 

Et vous relis comme ceci:

var ticketData = ((FormsIdentity) User.Identity).Ticket.GetStructuredUserData(); 
var name = ticketData["name"]; 
var emailAddress = ticketData["emailAddress"]; 

Les données sont stockées dans le même cookie tenant le ticket d'authentification, il sera disponible aussi longtemps que l'utilisateur est connecté

la page du projet:. http://formsauthext.codeplex.com/

Nuget: http://nuget.org/List/Packages/FormsAuthenticationExtensions

1

Pourquoi? Vous pouvez accéder à Membership.GetUser depuis n'importe où. C'est une méthode statique. Quel est le point de placer une valeur que vous pouvez accéder de n'importe où dans un endroit auquel vous pouvez accéder de n'importe où?

+1

parce que vous n » Je vais aller à la base de données chaque fois que vous voulez afficher le nom complet de l'utilisateur, etc – Eranga

+1

@Eranga - Je pense qu'il serait beaucoup plus efficace de dériver votre propre fournisseur d'adhésion personnalisé qui met en cache les données, c'est simple à faire et vous pouvez le faire une fois, puis oubliez-le. Il y a plusieurs articles sur la façon de le faire. Une autre option consiste à créer un wrapper CachedMembershipUser qui met en cache ces données. Vous utilisez les mêmes interfaces, mais transmettez au fournisseur réel en cas de besoin. –

Questions connexes