开发一个小型Web应用程序,用于共享计算机。
当用户关闭浏览器窗口时,我希望删除会话和身份验证。
在“登录”页面中,我使用类似的方式对用户进行身份验证:
FormsAuthenticationTicket authTicket =
new FormsAuthenticationTicket(1,txtUser.Text,
DateTime.Now,
DateTime.Now.AddMinutes(5),
false,"");
string encTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
HttpContext.Current.Response.Cookies.Add(faCookie);
string redirectUrl = FormsAuthentication.GetRedirectUrl(txtUser.Text, false);
HttpContext.Current.Response.Redirect(redirectUrl);
如您所见,我已将“isPersistent”变量设置为false。
这似乎适用于Chrome(尚未在IE上测试),但是,当我在Firefox上运行应用程序时,激活了多个选项卡,如果我关闭浏览器并再次打开,我仍然进行身份验证,并且cookie是还在那里!
它真的很奇怪,因为关闭时应删除cookie ...当你打开多个标签时,这是Firefox的错误吗?我该如何解决这个问题?
非常感谢帮助!
提前致谢
答案 0 :(得分:4)
您是关闭浏览器还是只关闭一个标签?您需要关闭整个浏览器。如果您打开了多个顶级浏览器窗口,则需要关闭所有这些窗口。此外,还需要关闭属于FireFox进程的任何其他窗口:下载,实时HTTP标头,查看页面源等。
答案 1 :(得分:2)
感谢提示小伙伴,但我确定我关闭了浏览器,没有打开任何与Firefox相关的窗口。
通过阅读this,这似乎是Firefox 3设计者选择的默认浏览器行为......
似乎它存储在存储在RAM上的磁盘cookie上,以便在再次打开浏览器时恢复选项卡。因此,如果要删除会话,则需要关闭所有选项卡,然后关闭浏览器...
我认为这会导致一些有关身份验证安全性的缺陷,例如,有人正在使用该应用程序,完成工作并通过关闭浏览器而不是选项卡离开。由于计算机是共享的,所以在另一个用户打开浏览器之后,他将看到所有选项卡,并恢复上一个会话......
答案 2 :(得分:1)
我建议您使用此代码删除Cookie,而不是依赖Mozilla或任何其他浏览器:
if (Request.Cookies["UserSettings"] != null)
{
HttpCookie myCookie = new HttpCookie("UserSettings");
myCookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(myCookie);
}
有关此主题的更多信息:How to: Delete a Cookie
修改:
如果您想在页面卸载期间删除cookie,可以使用Javascript来完成:
<html>
<head>
<title></title>
<script type="text/javascript">
function deleteCookie()
{
var d = new Date();
document.cookie = "v0=1;expires=" + d.toGMTString() + ";" + ";";
alert(document.cookie);
}
</script>
</head>
<body onunload="deleteCookie()">
...
</body>
</html>
我认为在您的情况下Javascript是最好的解决方案。
答案 3 :(得分:1)
不要使用cookies,使用会话来存储经过身份验证的用户,ASP.NET将为您管理会话cookie,它可以与FireFox配合使用,更安全。
但是如果您想继续使用此身份验证cookie,请将代码放在Global.asax Session_Start事件中。
protected void Session_Start(object sender, EventArgs e)
{
HttpContext.Current.Request.Cookies.Remove(FormsAuthentication.FormsCookieName);
}
答案 4 :(得分:1)
问题源于这样一个事实,即如果你设置了一个过期,你将获得一个持久性cookie,以下代码适用于我,我希望用户在持久性或仅浏览器会话之间选择一个cookie“记住我“登录时的复选框:
public void SetAuthenticationCookie(LoginView loginModel)
{
if (!loginModel.RememberMe)
{
FormsAuthentication.SetAuthCookie(loginModel.Email, false);
return;
}
const int timeout = 2880; // Timeout is in minutes, 525600 = 365 days; 1 day = 1440.
var ticket = new FormsAuthenticationTicket(loginModel.Email, loginModel.RememberMe, timeout);
//ticket.
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted)
{
Expires = System.DateTime.Now.AddMinutes(timeout),
HttpOnly = true
};
HttpContext.Current.Response.Cookies.Add(cookie);
}
答案 5 :(得分:0)
只是猜测:确保您还没有打开FireFox下载窗口......
答案 6 :(得分:0)
我找到了这个解决方案,可能对其他人有所帮助:
if (Request.Cookies["TownID"] != null)
{
HttpCookie myCookie = Request.Cookies["TownID"];
myCookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(myCookie);
}