User.Identity.IsAuthenticated有时会返回false

时间:2011-08-10 11:33:52

标签: asp.net forms-authentication iprincipal

我正在使用asp.net 4.0和Form auth。 要检查用户是否经过身份验证,我使用User.Identity.IsAuthenticated。 大多数时候它工作完美,但我不知道如何,即使用户有auth,有时它返回false。 我的web.config:

<authentication mode="Forms">
    <forms name=".xyz" loginUrl="~/" timeout="120" protection="All" path="/" slidingexpiration=true/>
</authentication>

在global.asax中:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    string cookieName = FormsAuthentication.FormsCookieName;
    HttpCookie authCookie = Context.Request.Cookies[cookieName];

    if (authCookie == null)
    {
        return;
    }
    FormsAuthenticationTicket authTicket = null;
    try
    {
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    }
    catch
    {
        return;
    }
    if (authTicket == null)
    {
        return;
    }
    string[] roles = authTicket.UserData.Split(new char[] { '|' });
    FormsIdentity id = new FormsIdentity(authTicket);
    GenericPrincipal principal = new GenericPrincipal(id, roles);

    Context.User = principal;
}

并在登录页面中:

FormsAuthenticationTicket authTick = new FormsAuthenticationTicket(1, email.Text, DateTime.Now, DateTime.Now.AddDays(360), true, password.Text, FormsAuthentication.FormsCookiePath);
string encriptTicket = FormsAuthentication.Encrypt(authTick);

HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encriptTicket);
authCookie.Expires = DateTime.Now.AddDays(360);
Response.Cookies.Add(authCookie);

我还每5分钟使用一次ajax请求。保持会话活动,这也重置auth超时因为slidingexpiration值。 我不知道它有什么问题。有时相同的会话和同一分钟,即使它为所有其他页面返回true,它也会为一个页面返回false。我从来没有遇到过这个错误,但我的访问者声称这个问题。

1 个答案:

答案 0 :(得分:2)

我发现了这个问题。问题在于www.address.com和address.com之间的区别。 www版本假装像一个子域并创建新的会话和身份验证。如果用户在没有www前缀的情况下重定向到www地址,则会发生错误。我会尝试重写url来解决它。