新手:MVC3身份验证 /记住我



我是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;
    }

在这一点上,我的会话具有完整的用户填充对象,我通过网站使用它,到目前为止工作正常。

下次用户击中网站时,用户已经进行了身份验证(请记住我设置为true),而user.Identity.name具有以前已认证的用户的电子邮件地址,这是正确的。问题在于,我想以在登录操作中以相同的方式加载用户填写。我想要一个我这样做的地方,而不是在每个[授权]动作中。

有这样的方式吗?

这样做的一种方法是创建一个安全性访问,您可以通过该访问用户信息。然后,您可以将您的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只是一个包装器,可以更轻松地访问有关身份验证的用户的信息。

做到这一点的更好方法是实现自定义和/或iPrincipal。您将将常用信息存储在身份验证cookie中。如果信息不敏感(即您只使用它显示用户名称而不用于与安全有关的任何安全性),则可以将其存储在自己的cookie中。

这里有一篇不错的文章:

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

最新更新