Request.IsAuthenticated总是如此。我错过了吗?

时间:2011-02-11 00:25:40

标签: asp.net authentication

我正在尝试向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。我在登录到同一页面后尝试重定向但仍然无法正常工作。有什么想法吗?

1 个答案:

答案 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添加到响应中)......