2011-05-05 148 views
4

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

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> 

阅读有关自动检测和SetAuthCookie MSDN上的文档,我得到了:

自动检测指定饼干 如果设备配置文件支持 Cookie,则使用此设置;否则,cookies不是 已使用。对于已知支持cookie的 的桌面浏览器,将启用探测 机制尝试使用 cookie。如果设备 不支持cookie,则不会使用探测机制。

FormsAuthentication.SetAuthCookie: 创建用于 提供的用户名认证凭证,并使用Cookie的身份验证其添加到 的 响应的Cookies集合,使用附送的饼干 路径,或使用URL,如果你是 。

我会认为,在我的情况下,无cookie身份验证会被使用,但它不是(我没有看到在重定向后的QueryString中的任何东西)。

如果我设置在RedirectFromLoginPage功能的断点和测试一些值,我得到:

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

我不知道如果Request.Browser.Cookies意味着是真还是假这里。浏览器不支持cookies,但它们全部被屏蔽...

无论如何,我已经在发生问题的机器上遥控了几分钟。隐私设置设置为中等,因此它应该能够接受cookie。这是一个标准的Win7/IE8设置。我试图将该网站添加到用户的信任区域,通过https登录,但它不起作用。其他问题的设置是相似的(没有真正突出的机器和用户告诉我,他们在其他网站没有问题)

那么我在这里做错了什么?

回答

1

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

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

+0

我不这样做,但不会通过将该网站添加到可信区域来避免这个问题? – 2011-05-05 19:31:19

+0

假设默认隐私级别没有改变,是的,应该这样做。只需确保在测试更改之前将站点添加到“受信任”区域后关闭所有IE会话。 – 2011-05-05 19:36:00

+0

另一个想法是,尝试清空浏览器缓存。我似乎记得一个完整的缓存导致过去的表单身份验证问题(只在IE中)。 – 2011-05-05 19:37:49

1

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