Asp.net mvc 如何在MVC3中存储用户首选项

Asp.net mvc 如何在MVC3中存储用户首选项,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我有一个MVC3应用程序,我想让用户能够设置在用户登录时启用的首选项 我真的不知道从哪里开始,如果能给我指出正确的方向,我会非常感激。我确实尝试过对会员制课程进行一些修改,但现在我认为这可能不是最好的方式 在您的数据库中创建一个新表。您可以在一个数据库中创建一个表(听起来您可能至少在现成的成员资格提供程序中使用了一个表),以唯一方式标识一个用户。在这种情况下,您可能希望实现自己的成员资格提供程序 您必须做一些工作来开始实现自己的提供者。如果这是您唯一的需求,那么您可以编写自己的类,以选择的格式返

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


我真的不知道从哪里开始,如果能给我指出正确的方向,我会非常感激。我确实尝试过对会员制课程进行一些修改,但现在我认为这可能不是最好的方式

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

您可以在一个数据库中创建一个表(听起来您可能至少在现成的成员资格提供程序中使用了一个表),以唯一方式标识一个用户。在这种情况下,您可能希望实现自己的成员资格提供程序

您必须做一些工作来开始实现自己的提供者。如果这是您唯一的需求,那么您可以编写自己的类,以选择的格式返回设置,从而避免这种情况

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"];
}

您可以使用FormsAuthenticationCookie存储用户信息,并避免始终访问数据库。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);
    }
authorization上受保护的覆盖无效(AuthorizationContext filterContext)
{
var authCookie=Request.Cookies[FormsAuthentication.FormScookeName];
if(authCookie!=null)
{
var authTicket=FormsAuthentication.Decrypt(authCookie.Value);
if(authTicket!=null)
{
var principal=new CustomPrincipal(HttpContext.User.Identity)
{
CurrentUserInfo=JsonConvert.DeserializeObject(authTicket.UserData)
};
HttpContext.User=principal;
AppUser=principal.CurrentUserInfo;
ViewBag.AppUser=AppUser;
}
}
基于授权(filterContext);
}

我真的在考虑如何在每页之间保留用户的首选项。我认为每次向用户呈现页面时都要进行数据库查找是不好的。如果只有几个首选项,那么人们通常会将这些首选项存储在cookie中吗?您可以始终将从数据库返回的数据保存在内存中r会话的持续时间。是的,我正在使用Microsoft.Samples.ServiceHosting.AspProviders和Azure表存储。MVC3的Cookie有多可靠?我说的成员资格提供程序在Cookie中存储身份验证信息对吗?@Grace Cookie不可靠。客户端(用户)可以编辑它们。您可以对其进行加密,但如果您的信息非常琐碎,则很难证明加密是正确的。可能这里采用的方法是
如果cookie值不存在(或无法解析),请使用默认设置
。是的,开箱即用,MVC3使用身份验证cookie。