【发布时间】: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