尽管我已经在这里呆了一段时间,这是我第一个有关SO的问题,所以请和我温柔.
我正在使用ASP.NET MVC 3,我想创建一个自定义的主体,所以我可以存储一些关于当前用户的信息比标准,因此不必经常去数据库.这是我以后的相当标准的东西.我们先说一下电子邮件地址和用户ID.
我已经决定将对象存储在缓存中,因为我知道不建议将其存储在会话中.
我也不想要继续投射User对象,所以我想覆盖控制器中的User对象.所以我可以去User.UserId并保证一些东西.
所以我创建了一个这样的自定义的主体:
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; } } }
我有一个这样的基本控制器:
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); } } } } }
如果你看看你会很快意识到,如果用户没有登录,那么对User对象的任何调用将不得不运行这一段代码:
return new MyPrincipal(base.User.Identity,Guid.Empty );
这对我来说感觉非常低效,尽管它只是为缺少的东西创建空的对象.
工作正常
所以我想我想知道这是否真的可以,我应该停止对性能和效率这么肛门,或者如果我的恐惧是正确的,那我该怎么办呢? [请不要说“得到生命,伴侣!”]