1

我正在尝试创建一种将用户的配置文件信息存储在会话或缓存中的方法,并且每次加载页面时都能够在手边拥有该信息,以防止每次加载页面时调用数据库。我希望能够将其中一些值放在共享布局中(这样我就可以将用户名放在右上角等)。在我的母版页布局的顶部,我有以下内容:

@{  

    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 等。我觉得可能有更好的方法来完成这样的任务。

4

2 回答 2

0

您可以创建一个静态类作为接口来获取用户属性,这些属性将存储在会话状态中。

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
}

注意:我在无法测试的情况下做了这个,但我希望你明白这一点:)

于 2013-01-14T19:37:27.990 回答
0

您可以将您的用户信息存储在身份验证 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.
}
于 2013-01-14T19:03:53.497 回答