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 – ASP.NET MVC缓存如何为AJAX请求工作?
- asp.net-mvc – MVC 4 Code First属性上的ForeignKeyAttrib
- asp.net – 作为MVC路径参数的文件路径
- asp.net – 无法CoCreate Profiler错误 – 但不使用分析器
- .net – ELMAH对企业库异常处理块
- 有趣的项目理念为体面的开发想要了解更多Asp.Net
- asp.net-mvc – 如何在MVC3中创建一个隐藏字段?
- asp.net – 在负载均衡器上启用粘性会话
- ASP.NET web.config:system.web.compilation中的debug属性
- asp.net-mvc – 添加分页MVC和Azure表存储
- asp.net-mvc – 实体类型没有键定义 – 代码优先
- iis – 是否需要serviceAutoStartProvider属性来
- asp.net-mvc – Asp.net MVC 3 RC – Razor Vali
- 身份电子邮件与破折号在Asp.Net身份
- asp.net – 如何在MVC4 Web API中自定义JSON序列
- asp.net – 有没有办法禁用整个页面的事件验证?
- asp.net – 你能用Javascript来检测服务器端创建
- asp.net-mvc – Web API 2需要使用尾部斜杠来使自
- asp.net – 在根站点下托管的应用程序中配置子目
- asp.net-mvc-4 – 当模型中存在一对多关系时,MVC
