我试图创建一种方法来存储用户的个人资料信息在会话或缓存,并能够有该信息在手每次页面加载,以防止调用数据库每次我们加载一个页面。我希望能够把一些这些值在共享布局(所以我可以把用户的名字在右上角等)。在我的主页布局的顶部,我有以下内容:
@{
Domain.Entities.UserProfile user = (Domain.Entities.UserProfile)HttpContext.Current.Session[Membership.GetUser().ProviderUserKey.ToString()];
}
我在我的主页中使用user.FirstName
这样的值。当用户登录时,我设置会话。有更好的方法吗?如果我注销,我只是导航到一个成员只有页面,[Authorize]
过滤器被绕过,我得到一个错误Object reference not set to an instance of an object.
,因为我的用户配置文件还没有存储在会话中。我不会在会话中存储任何敏感信息,如UserId或任何东西,只是用户名,个人资料图像url等。我觉得也许有更好的方法来做这件事。
可以将用户信息存储在身份验证cookie中。请记住,cookie将随着每个请求从客户端来回发送。所以如果有很多信息要存储,那可能不是正确的方式。
查看本文档的步骤4,该步骤解释了如何在cookie中存储额外的用户数据http://www.asp.net/web-forms/tutorials/security/introduction/forms-authentication-configuration-and-advanced-topics-cs
然后在你的主页上,你可以这样写
@{
if (User.Identity.IsAuthenticated)
{
//Your code goes here, no way user data is null.
}
您可以创建一个静态类作为接口来获取用户属性,这些属性将存储在会话状态中。
public class UserData{
public static Domain.Entities.UserProfile GetUser(){
string username;
try{
username = Membership.GetUser().ProviderUserKey.ToString();
}catch(Exception e){
// just in case
throw new AuthenticationException("The user isn't authenticated!");
}
var user = HttpContext.Current.Session[username] as Domain.Entities.UserProfile;
if(user == null){
user = // get data from database
HttpContext.Current.Session[username] = user;
}
return user;
}
}
然后,在你的方法中你可以这样使用它:
if (User.Identity.IsAuthenticated)
{
UserProfile user = UserData.GetUser();
//Your code goes here, no way user data is null.
}
或者在控制器中:
[Authorize]
public ActionResult Index(){
UserProfile user = UserData.GetUser();
return //stuff
}
注意:我做这个没有能够测试,但我希望你能明白:)