ASP.NET身份验证cookie

时间:2011-05-05 19:06:56

标签: c# .net asp.net authentication

在具有基于表单的身份验证的应用程序上,我有一个标准的ASP.NET登录控件,其中包含以下Authenticate事件处理程序。

void Login_Authenticate(object sender, AuthenticateEventArgs e)
{
    if (Security.AuthenticateUser(Login.UserName, Login.Password))
    {
        e.Authenticated = true;
        RedirectFromLoginPage(Login.UserName);
    }
    else
    {
        e.Authenticated = false;
    }
}

RedirectFromLoginPage函数如下所示:

private void RedirectFromLoginPage(String username)
{
    String returnUrl = GetReturnUrl();
    FormsAuthentication.SetAuthCookie(username, true, "/");
    Response.Redirect(returnUrl, true);
}

这在99%的情况下都能正常工作。但是,我有时会收到无法登录的人的支持电话。他们会输入他们的凭据,重定向回主页(当一切正常时会发生这种情况),但他们不会登录。

确定它可能是一个cookie问题,我试图通过将我的隐私选项设置为“阻止所有Cookie”来重现我的环境中的问题,并且我能够重现该问题。调用SetAuthCookie函数,但在下一页上,加载HttpContext.Current.User.Identity.IsAuthenticated将返回false。

在我的web.config中,身份验证的设置如下:

<authentication mode="Forms">
  <forms loginUrl="..." timeout="180" cookieless="AutoDetect"/>
</authentication>

在MSDN上阅读有关AutoDetect和SetAuthCookie的文档,我明白了:

  

AutoDetect指定cookie   如果设备配置文件支持,则使用   饼干;否则,饼干不是   used.For桌面浏览器   已知支持cookie,探测   机制将用于尝试使用   cookie,启用时。如果是设备   不支持cookie,不支持探测   机制将被使用。

     

FormsAuthentication.SetAuthCookie:   为其创建身份验证票证   提供的用户名并将其添加到   饼干的集合   响应,使用提供的cookie   路径,或者如果您使用URL   使用无cookie身份验证。

我想在我的场景中,会使用无cookie身份验证,但事实并非如此(在重定向之后,我在QueryString中看不到任何内容)。

如果我在RedirectFromLoginPage函数中设置了一个断点并测试了一些我得到的值:

bool cookieSupport = Request.Browser.Cookies; //"true"
bool redirectWithCookies = Request.Browser.SupportsRedirectWithCookie; //"true"
HttpCookieMode currentMode = FormsAuthentication.CookieMode; //"AutoDetect"

我不确定Request.Browser.Cookies在这里是否真实。浏览器确实支持cookie,但它们都被阻止了......

无论如何,我在发生问题的机器上进行了几分钟的远程操作。隐私设置设置为中等,因此它应该能够接受cookie。这是一个标准的Win7 / IE8设置。我尝试将网站添加到用户的受信任区域,通过https登录,但它无法正常工作。其他问题设置是相似的(没有什么真正脱颖而出的机器和用户告诉我,他们在其他网站上没有问题)

那我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

您是否在web.config文件中为表单身份验证cookie指定了域?它是否与网站的域名匹配?

我相信IE中的中等安全设置会阻止第三方Cookie,因此问题可能是IE认为您的身份验证Cookie是第三方Cookie。

答案 1 :(得分:1)

我遇到了类似的问题。但它仅适用于Internet Explorer 8.经过一番研究,我认为默认情况下IE8在无法烹饪模式下运行。所以,我在web.config中更改了这一行: <forms loginUrl="..." timeout="180" cookieless="AutoDetect"/><forms loginUrl="..." timeout="180" cookieless="UseUri"/>,它运行正常。