0

Итак, что я пытаюсь выполнить, это базовое действие стиля «помнить меня» для пользователей моего приложения.MVC4 Forms Authentication Auto Login

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

Чтобы проверить свой код, то, что я сделал, это запустить отладчик, вручную убить мой cookie сеанса в инструментах разработчика chrome, а затем перезагрузить страницу. Пройдя через код, он входит в метод автоматического входа в систему, как и ожидалось, и переходит к сбросу моих данных сеанса. Однако, если я жду чрезмерного количества времени, например, 4 часа, и попробуйте то же самое, он не будет автоматически перезагружать мою сессию. (Предполагая, что я оставил отладчик на такое количество времени).

EDIT: Для большей ясности, когда эта ошибка происходит, я могу открыть инструменты dev и убедиться, что билет аутентификации по-прежнему доступен. Это просто код для сброса моего сеанса, либо не работает, а из-за ошибки. Из-за редкости, в которой это происходит, трудно отследить.

Итак, на код.

Я вызываю метод автоматического входа в систему void в конструкторе контроллера и передаю httpcontext в метод автоматического входа.

Контроллер

public class SiteController : Controller 
{ 
    public SiteController() 
    { 
     this.UserAutoLogin(System.Web.HttpContext.Current); 
    } 

    // GET: /Site/ 
    public ActionResult Index() 
    { 
     ViewBag.CatNav = this.RenderNavCategories(); 
     return View(); 
    } 
} 

Авто Логин Код

public static void UserAutoLogin(this Controller Controller, System.Web.HttpContext context) 
{ 
    HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(FormsAuthentication.FormsCookieName); 

    if (cookie != null) 
    { 
     FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 

     if (ticket != null) 
     { 
      if (ticket.Name.Length > 0) 
      { 
       try 
       { 
        if (context.Session["UserName"] == null) 
        { 
         //get user from db 
         PersonRepository PersonRepo = new PersonRepository(); 
         PersonModel Member = PersonRepo.GetUserUserName(ticket.Name); 

         if (Member.FirstName != null) //if this is null...then the cookie is wrong, so don't do shit 
         { 
          //Set the session parameters 
          context.Session["FirstName"] = Member.FirstName; 
          context.Session["LastName"] = Member.LastName; 
          context.Session["UserId"] = Member.Id; 
          context.Session["UserName"] = Member.Username; 
          context.Session["Email"] = Member.Email; 
          context.Session["IsUser"] = 1; 
          context.Session["Zip"] = Member.Zip; 

          FormsAuthentication.SignOut(); 
          FormsAuthentication.SetAuthCookie(Member.Username, true); 
         } 
        } 
       } 
       catch (Exception ex) 
       { 
        // don't do anything for now - do something smart later :)       
        Console.WriteLine(ex.ToString()); 
       } 
      } 
     } 
    } 
} 
+0

Взгляните на этот вопрос: http://stackoverflow.com/questions/5619791/implementing-remember-me-feature-in- asp-net-mvc – Kostadin

+0

Цените ответ, но это на самом деле не помогает мне. – mituw16

+0

Есть ли какая-то особая причина, по которой вы передаете метод HttpContext.Current в AutoLogin вместо использования одного из контроллера и затем игнорируете его при получении файла cookie (снова вызываете HttpContext.Current)? Похоже, вы понятия не имеете, что вы там делаете. – MikeSW

ответ

0

Потому что, когда IIS перерабатывает приложение, новый ключ машина генерируется. Билет FormsAuthentication подписывается с использованием этого ключа, поэтому, когда ключ изменяет старый билет, он не распознается. Вам нужно использовать фиксированный машинный ключ.

Edit: Убрана ссылка на ключевой сайт генератора (ныне несуществующей)

+0

Спасибо, я сделаю это. – mituw16

+0

Кажется, это работает, я думаю, вы ударили его по голове Майком. Благодаря! – mituw16

+0

Эта ссылка берет на китайский сайт – Dev