Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is User (as in User.Identity.Name) null in my abstract base controller?

Tags:

I was asking a related question but messed the title up and no-one would understand it. Since I am able now to ask the question more precisely, I decided to reformulate it in a new question and close the old one. Sorry for that.

So what I want to do is passing data (my custom user's nickname as stored in the db) to the LoginUserControl. This login gets rendered from the master page via Html.RenderPartial(), so what I really need to do is making sure that, say ViewData["UserNickname"] is present on every call. But I don't want to populate ViewData["UserNickname"] in each and every action of every controller, so I decided to use this approach and create an abstract base controller which will do the work for me, like so:

public abstract class ApplicationController : Controller     {         private IUserRepository _repUser;          public ApplicationController()         {             _repUser = RepositoryFactory.getUserRepository();             var loggedInUser = _repUser.FindById(User.Identity.Name); //Problem!             ViewData["LoggedInUser"] = loggedInUser;         }     } 

This way, whatever my deriving Controller does, the user information will already be present.

So far, so good. Now for the problem:

I can't call User.Identity.Name because User is already null. This is not the case in all of my deriving controllers, so this is specific for the abstract base controller.

I am setting the User.Identity.Name via FormsAuthentication at another place in the code, but I think this can't be the problem - afaik User.Identity.Name can be null, but not User itself.

It looks to me like the HttpContext is not available (since also null ;-) and that I am missing a simple yet important point here. Can anyone give me some hints? I would really appreciate it.

like image 569
Masterfu Avatar asked Jan 10 '09 07:01

Masterfu


2 Answers

The answer to this problem is actually quite simple. I can't execute the code from within the constructor for reasons pointed out by Raimond, but I can do it outside the constructor.

So what I did was overriding onActionExecuting() in the base controller class (I created a custom Attribute for it, but just overriding the method should also work) and then do my user lookup from there.

Now it works as expected and I have no repeated code.

like image 81
Masterfu Avatar answered Dec 07 '22 16:12

Masterfu


The User property is not assigned until after the Controller has been instantiated, but you can gain early access from your constructor with:

System.Web.HttpContext.Current.User 
like image 41
Austin Hummel Avatar answered Dec 07 '22 15:12

Austin Hummel