ASP.NET 身份验证 cookie

本文关键字:cookie 身份验证 NET ASP | 更新日期: 2023-09-27 17:55:12

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

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的文档,我得到了:

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

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

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

如果我在重定向从登录页面函数中设置断点并测试一些值,我会得到:

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

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

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

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

ASP.NET 身份验证 cookie

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

我相信IE

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

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