asp.net mvc 3 - установить глобальные данные пользователя - PullRequest
2 голосов
/ 08 мая 2011

Как я могу установить глобальные пользовательские данные, которые сохраняют некоторую информацию, такую ​​как имя, фамилия и т. Д. Через страницы?Если я использую переменную сеанса, она истекает до файла cookie авторизации

спасибо!

Ответы [ 3 ]

5 голосов
/ 08 мая 2011

Вы можете сохранить данные на время сеанса аутентификации, используя поле userdata в файле cookie аутентификации.

Код ниже - это действие LogOn из AccountController в проекте MVC по умолчанию:

 [HttpPost]
 public ActionResult LogOn(LogOnModel model, string returnUrl)
 {
    if (ModelState.IsValid)
    {
        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }
    // If we got this far, something failed, redisplay form
    return View(model);
}

Вы можете заменить:

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

с:

string fullName = "User full name";

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, model.Email, DateTime.Now,
                DateTime.Now.AddDays(2), model.RememberMe, fullName);

string encTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) { Expires = DateTime.Now.AddDays(2) });

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

Затем вам нужно будет реализовать что-то для разбора сериализованных данных при использовании файла cookie авторизации.

Данные доступны через:

((FormsIdentity)User.Identity).Ticket.UserData;

Надеюсь, это поможет

Edit: Также измените DateTime.Now.AddDays (2) на любое, что вы хотите, чтобы ваш сеанс аутентификации оставался действительным.

1 голос
/ 08 мая 2011

Состояние сеанса может быть настроено различными способами для решения вышеуказанных проблем.В частности, если используется состояние сеанса в процессе (в котором состояние поддерживается в том же домене / пуле приложения, что и запущенное приложение), просто увеличьте время ожидания, чтобы оно было равно или больше времени ожидания файла cookie формы.Если вы хотите сохранить сеанс вне процесса (в удаленной системе или в базе данных), настройте его соответствующим образом.
Вот несколько ресурсов:

0 голосов
/ 08 мая 2011

Хранение его в вашем файле cookie может быть подделано, и срок его действия также может истечь. Как насчет этого - если вы можете сделать так, чтобы ваш сеанс и файл cookie истекали одновременно, сработало бы это? Если это так, я могу легко предоставить вам это решение. Приведенный ниже код проверяет, недоступен ли сеанс, и в этом случае вы будете перенаправлены на страницу входа. Измените login.aspx ниже на любой ваш логин. Также при входе в систему вы ДОЛЖНЫ установить Session ["UniqueUserId"] в какое-то значение (может быть что угодно ... просто должно быть установлено что-то)

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            //Only access session state if it is available
            if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState)
            {
                //If we are authenticated AND we dont have a session here.. redirect to login page.
                HttpCookie authenticationCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
                if (authenticationCookie != null)
                {
                    FormsAuthenticationTicket authenticationTicket = FormsAuthentication.Decrypt(authenticationCookie.Value);
                    if (!authenticationTicket.Expired)
                    {
                        if (Session["UniqueUserId"] == null)
                        {
                            //This means for some reason the session expired before the authentication ticket. Force a login.
                            FormsAuthentication.SignOut();
                            Response.Redirect("Login.aspx", true);
                            return;
                        }
                    }
                }
            }
        }

...