【问题标题】:ASP.NET Authentication cookieASP.NET 身份验证 cookie
【发布时间】:2011-08-19 15:49:18
【问题描述】:

在具有基于表单的身份验证的应用程序上,我有一个标准的 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 是 使用,如果设备配置文件支持 饼干;否则,cookie 不是 使用。对于桌面浏览器 已知支持 cookie,一个探测 机制将用于尝试使用 cookie,启用时。如果一个设备 不支持cookies,没有探测 将使用机制。

FormsAuthentication.SetAuthCookie : 为 提供的用户名并将其添加到 的 cookie 集合 响应,使用提供的 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 在这里是否是真的。浏览器确实支持cookies,但是都被屏蔽了……

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

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

【问题讨论】:

    标签: c# .net asp.net authentication


    【解决方案1】:

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

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

    【讨论】:

    • 我不知道,但是通过将站点添加到受信任区域不是可以避免这个问题吗?
    • 假设默认隐私级别没有更改,是的,应该这样做。只需确保在将站点添加到受信任区域后关闭所有 IE 会话,然后再测试更改即可。
    • 另一个想法,尝试清空浏览器缓存。我似乎记得过去有一个完整的缓存导致表单身份验证出现问题(仅在 IE 中)。
    • 是的,我已经这样做了(清空缓存和重新启动 IE)都无济于事。它只是没有检测到它应该使用 cookieless 的事实让我担心。感谢您的帮助。
    • 如果可以,您可能需要下载并安装 IEWatch (iewatch.com) 的评估副本。该工具将允许您查看用户浏览器上的 cookie 发生了什么。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2011-11-21
      • 2015-10-09
      • 2016-05-30
      • 2018-02-24
      • 2021-06-26
      相关资源
      最近更新 更多