我正在尝试向Cookie添加用户名并在注销时清除它,但Request.IsAuthenticated
总是返回true,所以我无法在下一页知道它是否是成员。
以下是我正在尝试的内容:
public void Logout()
{
FormsAuthentication.SignOut();
Session.Abandon(); // trying everything...
}
protected void signin_submit_Click(object sender, EventArgs e)
{
//checklogins...
HttpCookie authCookie = FormsAuthentication.GetAuthCookie(username_top.Text, true);
}
我点击了javascript函数的Logout,它点击了调试器,所以我确定它被调用了。
我正在检查Page_Load
上的值:
protected void Page_Load(object sender, EventArgs e)
{
bool isAuth = Request.IsAuthenticated; // always true !!!
if (isAuth)
{
registeredDiv.Visible = true;
guestDiv.Visible = false;
}
}
我错过了什么?如何知道用户是否已登录?
编辑:我发现在web.config中将authenticationMode
设置为Windows。
编辑为:
<authentication mode="Forms">
但现在它总是返回false。我在登录到同一页面后尝试重定向但仍然无法正常工作。有什么想法吗?
答案 0 :(得分:7)
当你说你正在调试调试器并通过Javascript进行调用时,你是通过ajax这样做的吗?我想知道你确实退出了,但没有重定向用户,这意味着用户在那台机器上的cookie没有被覆盖/破坏,所以当他们下次请求一个页面时,它再次起作用,因为cookie仍然存在存在。
当用户点击您网站上的退出按钮时,您确实需要将其重定向到新网页,以便可以正确设置(或取消设置)Cookie ...这是MSDN Article on Forms Authentication Signout它的示例代码调用RedirectToLoginPage()
,它将按前面提到的那样对cookie进行排序。
我发现FireCookie for Firebug在调试与Cookie相关的问题时非常有用。
修改强>
根据我链接到的MSDN文章:
您可以使用SignOut方法 与...结合 RedirectToLoginPage方法记录一个 用户输出并允许其他用户访问 登录。
您的代码没有调用RedirectToLoginPage
,因此仅调用FormsAuthentication.SignOut()
是不够的(除非您要手动执行RedirectToLoginPage的工作)
编辑2
也许更改您的登录按钮代码以使用此功能:
FormsAuthentication.RedirectFromLoginPage(username_top.Text, true)
因为这会自动处理所有cookie的设置......
编辑3
很高兴你把它整理出来,上面的函数(编辑2)就完成了你所说的错过了(将cookie添加到响应中)......