Итак, что я пытаюсь выполнить, это базовое действие стиля «помнить меня» для пользователей моего приложения.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());
}
}
}
}
}
Взгляните на этот вопрос: http://stackoverflow.com/questions/5619791/implementing-remember-me-feature-in- asp-net-mvc – Kostadin
Цените ответ, но это на самом деле не помогает мне. – mituw16
Есть ли какая-то особая причина, по которой вы передаете метод HttpContext.Current в AutoLogin вместо использования одного из контроллера и затем игнорируете его при получении файла cookie (снова вызываете HttpContext.Current)? Похоже, вы понятия не имеете, что вы там делаете. – MikeSW