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登录,但没有工作。其他问题设置类似(机器没有什么真正突出的,用户告诉我他们在其他网站上没有问题)
那么我在这里做错了什么?
是否在 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"/>
,它工作正常。