所以,我想要完成的是我的应用程序用户的基本“记住我”风格动作。
到目前为止,我已经完成了所有内容的编写工作,并且大部分时间都按预期工作。有时,检查持久性Forms身份验证票证的方法不会自动登录,我无法弄清楚为什么它只是偶尔发生 。
要测试我的代码,我所做的就是启动调试器,在chrome的开发工具中手动终止我的会话cookie,然后重新加载页面。单步执行代码,它按预期进入自动登录方法,然后继续重置我的会话数据。但是,如果我等待过多的时间,比如4个小时,并尝试相同的事情,它不会自动重置我的会话。 (假设我已经让调试器运行了那段时间)。
编辑:为了清楚起见,当发生此错误时,我可以打开开发工具并查看身份验证票证是否仍然可用。只是重置我的会话的代码要么没有运行,要么在某处出错。由于发生这种情况的频率很低,很难追查到。
所以,在代码上。
我在控制器的构造函数中调用静态void auto登录方法,并将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 :(得分:0)
因为当IIS回收应用程序时,会生成新的计算机密钥。 FormsAuthentication票证使用该密钥签名,因此当密钥更改时,无法识别旧票证。您需要使用固定的机器密钥。
修改:删除了指向密钥生成器网站的链接(现已解散)