所以,我想要完成的是我的應用程序的用戶基本的「記住我」風格的行動。MVC4表單身份驗證自動登錄
到目前爲止,我已經完成了所有工作,並且大部分時間都按預期工作。有時候,檢查持久化Forms身份驗證票證的方法不會自動登錄,我不知道爲什麼它只是偶爾發生。
爲了測試我的代碼,我所做的是啓動調試器,在chrome的開發工具中手動殺掉我的會話cookie,然後重新加載頁面。單步執行代碼,它會按預期方式進入自動登錄方法,並繼續重置會話數據。但是,如果我等待4個小時的時間過長,並嘗試使用相同的功能,它不會自動重置我的會話。 (假設我已經讓調試器運行了這段時間)。
編輯:爲了清楚起見,發生此錯誤時,我可以打開開發工具並查看身份驗證票據是否仍可用。這只是重置我的會話的代碼要麼不運行,要麼在某處出錯。由於這種情況發生頻率很低,因此很難追查。
因此,到代碼。
我在控制器的構造函數中調用靜態無效自動登錄方法,並將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方法,而不是使用Controller中的一個,然後在獲取Cookie時忽略它(再次調用HttpContext.Current)?看起來你不知道你在那裏做什麼。 – MikeSW