asp.net-mvc-3 – 如何初始化授权信息
好的,所以这似乎是一个常见的需要.有一点谷歌搜索找到了很多方法来做到这一点.我对最“mvc正确”的方式感兴趣.
我的应用程序的右上角有一个问候语,名叫Hello FirstName LastName.现在,通过IPrincipal(也就是User.Identity.Name)获取登录用户的用户名很容易.但是,这不会给我用户的名字和姓氏.我必须打到会员API才能得到这个. 点击会员API有其缺点.它每次都会点击数据库,这会为每个提供的页面增加一个额外的数据库访问权限.在登录时设置一些会话变量很容易,但这只适用于该会话.如果用户点击“记住我”,则下次没有登录,我必须仍然加载这些值. >我可以创建我自己的会员提供商做一些缓存,但是这对于一个或多或少的单一目的来说是很多工作. 我有没有想过的方法?什么是最“mvc正确”的做法? 解决方法
我认为最好的方法是使用Cookies.这是我在
my project中使用的解决方案:
创建一个类来保存数据 [DataContract] [Serializable()] public class AuthData { [DataMember] public String UserName { get; set; } [DataMember] public String FirstName { get; set; } [DataMember] public String LastName { get; set; } [DataMember] public String Email { get; set; } // any other property you need to a light-store for each user public override string ToString() { string result = ""; try { using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream,this); result = Convert.ToBase64String(stream.ToArray()); } } catch (Exception ex) { throw new HttpException(ex.Message); } return result; } static public AuthData FromString(String data) { AuthData result = null; try { byte[] array = Convert.FromBase64String(data); using (MemoryStream stream = new MemoryStream(array)) { stream.Seek(0,0); BinaryFormatter formatter = new BinaryFormatter(); result = (AuthData)formatter.Deserialize(stream,null); } } catch (Exception ex) { throw new HttpException(ex.Message); } return result; } } 登录方法: public static bool SignIn(string userName,string password,bool persistent){ if (Membership.ValidateUser(userName,password)) { SetAuthCookie(userName,persistent); return true; } return false; } 设置AuthCookie: public static void SetAuthCookie(string userName,bool persistent) { AuthData data = GetAuthDataFromDB(); // implement this method to retrieve data from database as an AuthData object var ticket = new FormsAuthenticationTicket( 1,userName,DateTime.Now,DateTime.Now.Add(FormsAuthentication.Timeout),persistent,data.ToString(),FormsAuthentication.FormsCookiePath ); string hash = FormsAuthentication.Encrypt(ticket); HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,hash); cookie.Expires = DateTime.Now.Add(FormsAuthentication.Timeout); cookie.HttpOnly = false; cookie.Path = FormsAuthentication.FormsCookiePath; HttpContext.Current.Response.Cookies.Add(cookie); } 获取AuthCookie: public static AuthData GetAuthCookie() { if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated && HttpContext.Current.User.Identity is FormsIdentity) { FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; FormsAuthenticationTicket ticket = id.Ticket; var data = AuthData.FromString(ticket.UserData); HttpContext.Current.Items["AuthDataContext"] = data; return data; } return null; } 在ControllerBase中 private AuthData _authData; private bool _authDataIsChecked; public AuthData AuthData { get { _authData = System.Web.HttpContext.Current.Items["AuthDataContext"] as AuthData; if (!_authDataIsChecked && _authData == null) { SignService.GetAuthCookie(); _authData = System.Web.HttpContext.Current.Items["AuthDataContext"] as AuthData; _authDataIsChecked = true; } return _authData; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 使用LINQ从MVC调用存储过程而不指定类结构(
- asp.net-mvc – 使用MVC Framework RC1更新断开连接的LINQ对
- 处理vbscript中的时区
- asp.net-mvc – ASP.NET MVC 2中的验证是如何实际工作的?
- asp.net-mvc – 如何为ASP.NET MVC编写自己的View引擎?
- asp.net – ASP调试 – 点击断点然后中止当前请求的执行
- asp.net-mvc – jQuery Mobile和不显眼的验证
- asp.net – Web API – Web窗体项目安全性错误
- asp.net-mvc – 在哪里可以找到mvc 2的windsor控制器工厂?
- asp.net-mvc – 动作命名约定