在具有基于表单的身份验证的应用程序上,我使用以下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登录,但它不起作用。其他问题的设置是相似的(没有真正突出的机器和用户告诉我,他们在其他网站没有问题)
那么我在这里做错了什么?
我不这样做,但不会通过将该网站添加到可信区域来避免这个问题? – 2011-05-05 19:31:19
假设默认隐私级别没有改变,是的,应该这样做。只需确保在测试更改之前将站点添加到“受信任”区域后关闭所有IE会话。 – 2011-05-05 19:36:00
另一个想法是,尝试清空浏览器缓存。我似乎记得一个完整的缓存导致过去的表单身份验证问题(只在IE中)。 – 2011-05-05 19:37:49