MVC4表单身份验证自动登录

时间:2014-02-07 17:33:47

标签: c# asp.net-mvc-4 forms-authentication session-state session-timeout

所以,我想要完成的是我的应用程序用户的基本“记住我”风格动作。

到目前为止,我已经完成了所有内容的编写工作,并且大部分时间都按预期工作。有时,检查持久性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());
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

因为当IIS回收应用程序时,会生成新的计算机密钥。 FormsAuthentication票证使用该密钥签名,因此当密钥更改时,无法识别旧票证。您需要使用固定的机器密钥。

修改:删除了指向密钥生成器网站的链接(现已解散)