ASP.net MVC FormsAuthentication cookie丢失

时间:2014-06-13 04:09:21

标签: c# asp.net asp.net-mvc forms-authentication

我正在使用FormsAuthentication编写ASP.net MVC 5应用程序。我使用FormsAuthentication.SetAuthCookie(user.Email, model.RememberMe)完成了一切并正常工作。

但是,我想创建一个自定义票证,这样我就可以在票证的UserData字段中存储一些额外的信息。这就是我创建故障单并将其存储在cookie中的方式:

var ticket = new FormsAuthenticationTicket(1, user.Email, DateTime.Now, DateTime.Now.AddMinutes(FormsAuthentication.Timeout.Minutes), model.RememberMe, user.AuthToken);
var encryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) { Domain = FormsAuthentication.CookieDomain, Path = FormsAuthentication.FormsCookiePath, HttpOnly = true, Secure = FormsAuthentication.RequireSSL };
HttpContext.Response.Cookies.Add(cookie);

这会创建一个加密的故障单并将其发送到浏览器。我已经通过开发人员工具和Fiddler验证了该票证是否存在于浏览器中,并且在后续请求中将其发送回服务器。

但身份验证现已破裂。此外,Cookie在Application_AuthenticateRequestApplication_PostAuthenticateRequest个事件中不可用。当我使用调试器来探索Context.Request.Cookies时,它不在列表中。

奇怪的是,如果我退回管道并在Application_BeginRequest中检查它,那么cookie确实存在:

void Application_BeginRequest(object sender, EventArgs e)
{
    // Auth cookie exists in the collection here! Ticket decrypts successfully
    HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie == null)
        return;
    var encTicket = authCookie.Value;
    var ticket = FormsAuthentication.Decrypt(encTicket);
}

void Application_AuthenticateRequest(object sender, EventArgs e)
{
    // Auth cookie missing from the cookies collection here!
    HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie == null)
        return;

    var encTicket = authCookie.Value;
    var ticket = FormsAuthentication.Decrypt(encTicket);
    using (var db = new BadgerContext())
    {
        var user = db.Users.OfType<RegisteredUser>().FirstOrDefault(x => x.UserName == ticket.Name);
        if (ticket.UserData != user.AuthToken)
        {
            FormsAuthentication.SignOut();
            Response.Redirect(FormsAuthentication.DefaultUrl);
        }
    }
}

因此,在BeginRequest之后AuthenticateRequest之前,某些内容正在从Cookie中剥离我的自定义FormsAuthenticationTicket。不幸的是,这会破坏网站上的身份验证。

创建自定义故障单时,是什么原因造成了这种行为?我的cookie创建有问题吗?

2 个答案:

答案 0 :(得分:6)

检入。system.web节点内的.config文件,httpRuntime标记。

<httpRuntime targetFramework="4.5" />

与主网站相同

答案 1 :(得分:0)

Rowan建议我查看FormsAuthentication.Timeout.Minutes的值。经过调查,此值始终返回0。这导致票证立即到期。我不得不使用FormsAuthentication.Timeout.TotalMinutes而一切都开始正常工作