2

我是 MVC 的新手,所以这个问题可能是微不足道的。在我的登录操作中,我执行以下操作:

public ActionResult LogOn(UserModel userModel, string returnUrl)
    {
        ActionResult retvalue = null;
        UserProfile user = MyDatabaseAccess.Instance.GetAuthenticatedUser(userModel.EmailAddress, userModel.Password);
        if (user != null)
        {
            FormsAuthentication.SetAuthCookie(userModel.EmailAddress, userModel.RememberMe);
            Session["LoggedOnUser"] = user;
            if (Url.IsLocalUrl(returnUrl))
            {
                retvalue = Redirect(returnUrl);
            }
            else
            {
                retvalue = RedirectToAction("Home", "Home");
            }
        }
        else
        {
            retvalue = RedirectToAction("LogOn", "Account");
        }
        return retvalue;
    }

此时,我的会话具有完整的 UserProfile 对象,并且我通过网站使用它,到目前为止一切正常。

下次用户访问该网站时,该用户已经通过身份验证(rememberme 设置为 true),并且 User.Identity.Name 具有之前通过身份验证的用户的电子邮件地址,这是正确的。问题是我想将 UserProfile 加载到会话中,就像在 LogOn 操作中一样。我想要一个我这样做的地方,而不是在每个 [授权] 行动中。

有没有这样的方法?

4

2 回答 2

2

一种方法是创建一个 SecurityContext ,您可以通过它访问用户信息。然后,您可以将 SecurityContext 保留在会话中。如果用户已通过身份验证,但会话中不存在 SecurityContext,则您从 Db 读取数据并将其再次添加到会话中。

可能是这样的:

public static class SecurityContext
{
    public static UserProfile CurrentUser
    {
        get
        {
            var user = HttpContext.Current.Session["CurrentUser"] as UserProfile;

            if (user == null)
            {
                using (var ctx = new YourDbContext())
                {
                    user = ctx.User.SingleOrDefault(u => u.UserName == 
                               HttpContext.Current.User.Identity.Name);
                    HttpContext.Current.Session["CurrentUser"] = user;
                }
            }

            return user;
        }
        set
        {
            HttpContext.Current.Session["CurrentUser"] = value;
        }
    }
}

在您的应用程序中的任何时候,您都可以通过调用访问您的用户配置文件SecurityContext.CurrentUser

当然,您仍然必须使用[Authorized]控制器/操作上的属性来确保用户已通过身份验证。SecurityContext 只是一个包装器,可以更轻松地访问有关经过身份验证的用户的信息。

于 2012-10-23T20:22:32.460 回答
1

更好的方法是实现自定义 IIdentity 和/或 IPrincipal。您可以将经常使用的信息存储在身份验证 cookie 中。如果信息不敏感(即您只使用它来显示用户名而不用于任何与安全相关的事情),那么您可以将其存储在您自己的 cookie 中。

这里有一篇很好的文章:

http://www.bradygaster.com/custom-authentication-with-mvc-3.0

于 2012-10-23T20:32:33.550 回答