在具有基于表单的身份验证的应用程序上,我有一个标准的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登录,但它无法正常工作。其他问题设置是相似的(没有什么真正脱颖而出的机器和用户告诉我,他们在其他网站上没有问题)
那我在这里做错了什么?
答案 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"/>
,它运行正常。