如何在MVC3中存储用户首选项

时间:2011-06-09 12:29:07

标签: asp.net-mvc asp.net-mvc-3

我有一个MVC3应用程序,我想让用户能够设置用户登录时启用的首选项。

我真的不知道从哪里开始,我真的很感激被指向正确的方向。我确实尝试过对会员类的一些更改,但现在我认为这可能不是最好的方法。

3 个答案:

答案 0 :(得分:1)

一旦唯一标识用户,您就可以在数据库中执行此操作(听起来您可能至少使用一个开箱即用的成员资格提供程序)。在这种情况下,您可能希望实施自己的会员提供商。

您必须做一些工作才能开始实施自己的提供商。如果这是您唯一的要求,您可以通过编写自己的类来避免它,该类以您选择的格式返回设置

public static class UserSettings
{
    public static string GetSettings(IPrincipal user)
    {
        if(user.Identity.IsAuthenticated)
        {
            // dip into database using user.Identity.Name property
            return "string with user settings";
            // this also assumes user.Identity.Name is uniquely able
            // to identify a user in your database!
        }

        return string.Empty;
    }
}

或者,如果信息完全无关紧要,也许您可​​以实现用户设置的cookie表示。当然,这包含了使用cookie的所有注意事项,但您可以避免将信息存储在数据库中

您拥有HttpContext的任何地方都可以获取设置值,如下所示:

if(HttpContext.Current != null)
{
    string userSettings = HttpRequest.Current.Request.Cookies["NameOfCookie"];
}

答案 1 :(得分:1)

您可以使用FormsAuthentication cookie存储您的用户信息,并避免一直访问数据库。该cookie已加密,您存储的任何信息都与用户会话本身一样安全。 Cookie的唯一问题是它们的最大大小为4K,因此,如果您的用户信息很大,那么您可能会遇到问题。当我使用cookie方法时,我将我的用户数据存储为JSON,然后在每个页面请求上反序列化该JSON。这是我的登录控制器逻辑(我使用SimpleMembership,但方法是相同的:

 public ActionResult Login(LoginModel model, string returnUrl)
 {
     if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, model.RememberMe))
     {
         var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
         if (authCookie != null)
         {
             var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
             if (authTicket != null)
             {
                 var user = _userLogic.GetItem(model.UserName);
                 if (user != null && user.IsActive)
                 {
                     var newAuthTicket = new FormsAuthenticationTicket(authTicket.Version, authTicket.Name, authTicket.IssueDate, authTicket.Expiration, authTicket.IsPersistent, JsonConvert.SerializeObject(user));
                     var newCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(newAuthTicket))
                     {
                         Expires = authCookie.Expires
                     };
                     Response.Cookies.Add(newCookie);
                     return RedirectToLocal(returnUrl);
                 }
                 WebSecurity.Logout();
                 ModelState.AddModelError("UserName", "This account has been deactivated.");
                 return View(model);
             }
         }
     }
     // If we got this far, something failed, redisplay form
     ModelState.AddModelError("", "The user name or password provided is incorrect.");
     return View(model);
 }

请注意newAuthTicket的创建以及用户实例如何作为JSON传递给它。在那之后,我所要做的就是在我的基本控制器的OnAuthorization方法中使用这个用户对象:

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            if (authTicket != null)
            {
                var principal = new CustomPrincipal(HttpContext.User.Identity)
                {
                    CurrentUserInfo = JsonConvert.DeserializeObject<User>(authTicket.UserData)
                };
                HttpContext.User = principal;
                AppUser = principal.CurrentUserInfo;
                ViewBag.AppUser = AppUser;
            }
        }
        base.OnAuthorization(filterContext);
    }

答案 2 :(得分:-1)

在数据库中创建一个新表。