Es este Principal personalizado en el controlador base ASP.NET MVC 3 terriblemente ineficiente?

A pesar del hecho de que he estado aquí por un tiempo, esta es mi primera pregunta sobre SO, así que por favor sé amable conmigo.

Estoy usandoASP.NET MVC 3 y quiero crear una @ personalizaPrincipal para poder almacenar un poco más de información sobre el usuario actual de lo normal, por lo que no tengo que ir a la base de datos con demasiada frecuencia. Es algo bastante estándar lo que busco. Digamos solo la dirección de correo electrónico y la identificación de usuario en primera instancia.

He decidido almacenar el objeto en la memoria caché porque soy consciente de que no se recomienda almacenarlo en la sesión.

Tampoco quiero tener que seguir lanzando elUser objeto, así que quería anular elUser objeto en el controlador. Entonces solo puedo irUser.UserId y estar garantizado de algo.

Así que creé un principal personalizado como este:

public class MyPrincipal : IPrincipal
{
    public MyPrincipal(IIdentity ident, List<string> roles, string email, Guid userId)
    {
        this._identity = ident;
        this._roles = roles;
        this._email = email;
        this._userId = userId;
    }

    IIdentity _identity;

    public IIdentity Identity
    {
        get { return _identity; }
    }

    private List<string> _roles;

    public bool IsInRole(string role)
    {
        return _roles.Contains(role);
    }

    private string _email;

    public string Email
    {
        get { return _email; }
    }

    private Guid _userId;

    public Guid UserId
    {
        get { return _userId; }
    }
}

Y tengo un controlador base como este:

public class BaseController : Controller
    {
        protected virtual new MyPrincipal User
        {
            get
            {
                if (base.User is MyPrincipal)
                {
                    return base.User as MyPrincipal;
                }
                else
                {
                    return new MyPrincipal(base.User.Identity, new List<string>(0), "", Guid.Empty );
                }
            }
        }

        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (User != null)
            {
                if (User.Identity.IsAuthenticated)
                {
                    if (User.Identity is FormsIdentity)
                    {
                        FormsIdentity id = base.User.Identity as FormsIdentity;
                        MyPrincipal principal = (MyPrincipal)filterContext.HttpContext.Cache.Get(id.Name);
                        if (principal == null)
                        {
                            MembershipUser user = Membership.GetUser();

                            // Create and populate your Principal object with the needed data and Roles.
                            principal = new MyPrincipal(id, Roles.GetRolesForUser(id.Name).ToList(), user.Email, (Guid)user.ProviderUserKey);
                            filterContext.HttpContext.Cache.Add(
                            id.Name,
                            principal,
                            null,
                            System.Web.Caching.Cache.NoAbsoluteExpiration,
                            new System.TimeSpan(0, 30, 0),
                            System.Web.Caching.CacheItemPriority.Default,
                            null);
                        }
                        filterContext.HttpContext.User = principal;
                        System.Threading.Thread.CurrentPrincipal = principal;
                        base.OnAuthorization(filterContext);
                    }
                }
            }
        }
    }

Si echas un vistazo, te darás cuenta rápidamente de que si el usuario no ha iniciado sesión, entoncesningun llamada a laUser object tendrá que ejecutar este bit de código:

return new MyPrincipal(base.User.Identity, new List<string>(0), "", Guid.Empty );

y esto me parece terriblemente ineficiente, aunque solo está creando objetos vacíos para las cosas que faltan.

Funciona bien

Así que supongo que quiero saber si esto está realmente bien y debería dejar de ser tan anal sobre el rendimiento y la eficiencia, o si mis temores son correctos, en cuyo caso, ¿qué debería hacer en su lugar? [Por favor, no diga "¡Obteniendo una vida, amigo!"]

Respuestas a la pregunta(2)

Su respuesta a la pregunta