2009-08-21 7 views
7

Pour mes actions qui vont interagir avec le compte de l'utilisateur, je souhaite créer un objet "TheUser" en plus de l'ajouter à "ViewData [" TheUser "]" dès qu'une action sur mon contrôleur est appelée.Définition d'un utilisateur avec User.Identity.Name dans le constructeur du contrôleur

Si l'utilisateur est connecté, il saisira les informations de l'utilisateur à partir de la base de données, sinon, l'objet "TheUser" sera simplement nul.

J'ai essayé d'accéder à "User.Identity.Name" dans le constructeur du contrôleur, mais il n'est pas créé avant l'appel d'une action.

Je regardais les filtres d'autorisation personnalisés, mais ceux-ci ne me permettaient pas de créer l'objet "TheUser" et de le stocker dans ViewData.

Voici un bref extrait de ce que je voudrais accomplir:

[Authorize] 
public class HomeController : Controller 
{ 
    User TheUser; 

    public HomeController() 
    { 
     TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null; 

     ViewData["TheUser"] = TheUser; 
    } 
} 
+0

cette réponse m'a aidé pour MVC3 http://stackoverflow.com/a/1506311/511438 –

Répondre

15

J'ai créé une classe de contrôleur de base personnalisée et lui ai ajouté une propriété "CurrentUser".

Dans la méthode Initialize, j'ai placé la logique pour obtenir l'utilisateur, puis l'ajouter à la propriété ViewData et à la propriété "CurrentUser" du contrôleur.

j'avais mes contrôleurs héritent de la classe de base personnalisée du contrôleur et j'ai pu faire référence à la variable « CurrentUser » partout dans le contrôleur:

public class CustomControllerClass : Controller 
{ 
    public User CurrentUser { get; set; } 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     if (requestContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      string userName = requestContext.HttpContext.User.Identity.Name; 
      CurrentUser = UserRepository.GetUser(userName); 
     } 

     ViewData["CurrentUser"] = CurrentUser;     
    } 
} 
+0

Lorsque j'ai hérité de mon contrôleur d'un BaseController, toutes mes requêtes Web s'arrêtent après l'exécution de la méthode Execute de BaseController et ne vont pas aux méthodes Action. Je reçois une page blanche dans le navigateur. Y a-t-il quelque chose de plus à faire pour cela? – teenup

+0

Puneet, s'il vous plaît jeter un oeil à mon édition. Ma réponse originale était pour ASP.NET MVC 1. Je l'ai mis à jour pour remplacer la méthode 'Initialize' comme c'est l'endroit d'accepter de faire ce genre de chose dans MVC 2 et 3 – Omar

+0

Merci beaucoup, j'ai vraiment apprécié cela. J'ai longtemps regardé, ta réponse était belle et concise. –

1

Est-ce que l'utilisateur doivent être instancié pour chaque action du contrôleur ou seulement ceux spécifiques?

Si vous créez un ActionFilterAttribute, vous avez accès au contexte du contrôleur. Je ne sais pas si cela est vrai pour AuthorizationFilters, mais vous pouvez essayer quelque chose comme ceci:

public class MyCustomFilter: ActionFilterAttribute 
{ 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["TheUser"] = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null; 
     base.OnActionExecuting(filterContext); 
    } 
} 

Ensuite, branchez ce aux actions du contrôleur nécessaires.

+0

lesPARAMETRES UTILISATEURdu Il est utilisé pour chaque action. Ce qui me laisse perplexe, c'est que, bien que [Authorize] m'assure que l'utilisateur est authentifié, je n'ai pas accès à User.Identity, mais je peux accéder à ViewData. – Omar

4

configurer mon contrôleur de base d'une manière similaire en utilisant la méthode constuctor, et j'ai pu lire cette information d'utilisateur sur le mannner suivant. Remarque: Je stocke uniquement l'ID utilisateur, pas l'objet Utilisateur, mais le point de mon code est de montrer comment vous pouvez obtenir les informations requises dans la méthode contriuctor.

public abstract class BaseController : Controller 
{ 
    int _UserId = 0; 

    public int UserId 
    { 
     get { return _UserId; } 
     set { _UserId = value; } 
    } 

    public BaseController() 
    { 
     var userFromAuthCookie = System.Threading.Thread.CurrentPrincipal; 

     if (userFromAuthCookie != null && userFromAuthCookie.Identity.IsAuthenticated) // && !String.IsNullOrEmpty(userFromAuthCookie.Identity.Name)) 
     { 
      busUser userBO = AceFactory.GetUser(); 
      string userNameFromAuthCookie = userFromAuthCookie.Identity.Name; 
      _UserId = userBO.GetUserIdByUsername(userNameFromAuthCookie); 
     } 
    } 
+0

J'essayais aussi de retourner l'utilisateur en utilisant User.Identity - 'System.Threading.Thread.CurrentPrincipal' l'a corrigé pour moi - merci beaucoup – wheelibin

3
public abstract class YourController : Controller 
{ 
    public YourController() 
    { 
     var user = System.Threading.Thread.CurrentPrincipal; 

     TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(user.Identity.Name) : null; 

     ViewData["TheUser"] = TheUser; 
    } 
} 
Questions connexes