Omar Omar - 1 year ago 163
C# Question

Defining a User with User.Identity.Name in controller constructor

For my actions that are going to interact with the User's account, I would like to create a "TheUser" object in addition to adding that object to "ViewData["TheUser"]" as soon as any action on my controller is called.

If the User is logged in, it will grab the User's info from the database, if not, "TheUser" object will just be null.

I tried accessing "User.Identity.Name" in the controller constructor, but it isn't created prior to any action being called.

I was looking at custom authorization filters, but those wouldn't allow me to create the "TheUser" object and store it in the ViewData.

This is a brief snippet of what I would like to accomplish:

public class HomeController : Controller
User TheUser;

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

ViewData["TheUser"] = TheUser;

Answer Source

I created a custom base Controller class and added a "CurrentUser" property to it.

In the Initialize method, I placed the logic to get the user and then add it to the ViewData and the "CurrentUser" property of the controller.

I had my controllers inherit the custom base Controller class and I was able to reference "CurrentUser" variable anywhere in the controller:

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

    protected override void Initialize(RequestContext requestContext)

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

        ViewData["CurrentUser"] = CurrentUser;