Как я могу сохранить пользовательские настройки в MVC3 - PullRequest
5 голосов
/ 09 июня 2011

У меня есть приложение MVC3, и я хотел бы дать пользователям возможность устанавливать настройки, которые будут активированы при входе пользователя в систему.

Я действительно не имею ни малейшего представления, с чего начать, и был бы очень признателен за указание в правильном направлении. Я попробовал внести некоторые изменения в класс участников, но теперь я думаю, что это, вероятно, не лучший способ добиться успеха.

Ответы [ 3 ]

1 голос
/ 09 июня 2011

Вы можете сделать это в базе данных (звучит так, как будто вы, возможно, используете ее хотя бы с провайдером членства «из коробки»), однозначно идентифицируя пользователя. В этом случае вы можете захотеть внедрить собственного провайдера членства.

Вы должны проделать небольшую работу, чтобы начать реализацию собственного провайдера. Если это ваше единственное требование, вы можете избежать его, написав свой собственный класс, который возвращает настройки в выбранном вами формате

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. Это, конечно, сопровождается всеми предостережениями об использовании куки, но вы можете избежать хранения информации в базе данных

В любом месте, где у вас есть HttpContext, вы можете получить значение настройки следующим образом:

if(HttpContext.Current != null)
{
    string userSettings = HttpRequest.Current.Request.Cookies["NameOfCookie"];
}
1 голос
/ 19 мая 2013

Вы можете использовать куки-файл FormsAuthentication для хранения вашей пользовательской информации и предотвращения постоянного доступа к базе данных. Этот файл cookie зашифрован, и любая информация, которую вы храните, так же безопасна, как и сам пользовательский сеанс. Единственная проблема с файлами cookie заключается в том, что они имеют максимальный размер 4 КБ, поэтому, если ваша пользовательская информация огромна, вы можете столкнуться с проблемой. Когда я использую подход 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);
    }
0 голосов
/ 09 июня 2011

Создайте новую таблицу в вашей базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...