Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

set current user in asp.net mvc

I'm not sure if this is the best way to do it, but I want to keep a user object alive during all requests of the current user. From reading several resources I learned that you should create your own IPrinciple which holds this. But I don't want to trigger the database every authentication request. Any recommendations on how to handle this? Is caching the db request a good idea?

 protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);

            User user;
            using (HgDataContext hg = new HgDataContext())
            {
                if (Session["user"] != null)
                {
                   user = (from u in hg.Users where u.EmailAddress == authTicket.Name select u).Single();
                } else
                {
                   user = Session["user"] as User;
                } 
            }
            var principal = new HgPrincipal(user);
            Context.User = principal;
        }
    }
like image 522
TomHastjarjanto Avatar asked Apr 14 '10 22:04

TomHastjarjanto


2 Answers

Session is probably the appropriate way to do this, and in fact is one of the few uses of Session that I'd advocate.

like image 154
Paul Avatar answered Sep 28 '22 23:09

Paul


I'm now using the following code which caches the user, take care that you remove the cache after an update!

 protected void Application_AuthenticateRequest(Object sender, EventArgs e)
        {
            HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie != null)
            {
                FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);

                User user;
                Cache cache = HttpContext.Current.Cache;
                using (HgDataContext hg = new HgDataContext())
                {
                    user =  cache[authTicket.Name] as User;
                    if (user == null)
                    {
                       user = (from u in hg.Users where u.EmailAddress == authTicket.Name select u).Single();
                       cache[authTicket.Name] = user;
                    }
                }
                var principal = new HgPrincipal(user);
                Context.User = principal;
            }
        }
like image 25
TomHastjarjanto Avatar answered Sep 28 '22 22:09

TomHastjarjanto