FormsAuthentication.SignOut()不起作用

时间:2012-07-30 09:48:36

标签: c# asp.net authentication

我正在开发一个带有安全部分的网站,即名为“PIP”的文件夹。

登录部分工作正常,但是当我点击注销时,用户仍然是已知的,如果他/她接触到安全部分,则不会被重定向到登录页面。

这是我的web.config:

<system.web>

<authentication mode="Forms">
  <forms loginUrl="Login.aspx" name=".ASPXFORMSAUTH">
  </forms>
</authentication>

</system.web>

<location path="PIP">
<system.web>
  <authorization>
    <deny users="?" />
  </authorization>
</system.web>
</location>

用户通过身份验证的登录页面:

FormsAuthentication.RedirectFromLoginPage(uid, false);

在安全文件夹(PIP)的default.aspx页面上有一个注销按钮,该按钮后面的代码:

FormsAuthentication.SignOut();
Response.Redirect("~/Default.aspx", true);

在页面“Default.aspx”是一个链接到〜/ PIP / Default.aspx,它应该被重定向到登录页面但不是。 注意会议似乎不会受到退出的影响。

我尝试了很多选项,手动删除会话。 Session.Clear,Session.Abandon但似乎没有任何效果。

我希望你们能指出我正确的方向!

提前致谢。

4 个答案:

答案 0 :(得分:4)

您需要在退出后放弃会话。

FormsAuthentication.SignOut();
Session.Abandon();
Response.Redirect("~/Default.aspx", true);

答案 1 :(得分:2)

在您退出之前,期间或之后,您是否有任何其他IE打开实例?如果没有,您可以发现cookie仍然存在于IE的共享cookie元素中。

您的网页上是否有任何到期日期?如果没有,页面可能仍在浏览器缓存中,并且不会调用服务器上的表单身份验证检查。

如果您关闭浏览器并尝试再次访问受保护资源并且必须登录然后才能正确配置....会话cookie不会用作表单身份验证过程的一部分,因此您无需担心它 - FormsAuthentication.SignOut()是执行此操作的正确方法。

在你的Global.asax.cs中添加以下事件处理程序 - 如果你还没有 - 并在其上放置一个断点。如果你在调用LogOff之后点击后续请求的断点,那么你可以破解cookie并查看它 - 我的猜测是你不会点击这个断点,因为请求是从缓存提供的。 / p>

    protected void Application_BeginRequest(object sender, EventArgs e) 
    {}

要破解cookie:

                HttpRequest currentRequest = HttpContext.Current.Request;

            // Attempt to get the Forms Auth Cookie from the Request
            HttpCookie authenticationCookie = currentRequest.Cookies[FormsAuthentication.FormsCookieName];

            if(authenticationCookie != null)
            {
                // Crack the Cookie open
                var formsAuthenticationTicket = FormsAuthentication.Decrypt(authenticationCookie.Value);

                // breakpoint here to see the contents of the ticket.
                if (formsAuthenticationTicket.Expired)
                {

                }
            }

在Firefox或Chrome中尝试这一点也是值得的,因为它们似乎可以立即摆脱cookie。

要禁用缓存,您可以将以下内容放在其中一个页面中:

    private static void SetImmediateExpiryOnResponse(HttpResponse response)
    {
        response.Cache.SetAllowResponseInBrowserHistory(false);
        response.Cache.SetCacheability(HttpCacheability.NoCache);
        response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
        response.Cache.SetNoStore();
        response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        response.Expires = -1;
        response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
        response.CacheControl = "no-cache";
    }

答案 2 :(得分:2)

设置过期的Cookie:

HttpCookie cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
cookie.Expires = DateTime.Now.AddYears(-1);
HttpContext.Current.Response.Cookies.Add(cookie);

答案 3 :(得分:0)

使用LoginView控件可以解决您的问题。

我的一个网站在web.config上有这个配置

<authentication mode="Forms">
        <forms loginUrl="~/Login.aspx" protection="All" timeout="30" name=".ASPXAUTH" path="/" requireSSL="false" slidingExpiration="true" 
               defaultUrl="Login.aspx" cookieless="UseDeviceProfile" enableCrossAppRedirects="false"/>
    </authentication>

然后在我的保护区域,我创建了一个新的web.config,只有这几行:

<configuration>
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</configuration>

在MasterPage中我使用LoginView控件:

<asp:LoginView ID="HeadLoginView" runat="server" EnableViewState="false">
      <AnonymousTemplate>
        <a href="../LoginReservedArea.aspx">Area Clienti</a>
        <%--[ <a href="~/Login.aspx" ID="HeadLoginStatus" runat="server">Log In</a> ]--%>
    </AnonymousTemplate>
    <LoggedInTemplate>
        Welcome <asp:LoginName ID="HeadLoginName" runat="server" />
        [<asp:LoginStatus ID="HeadLoginStatus" runat="server" LogoutAction="RedirectToLoginPage" LogoutText="Log Out" />]
    </LoggedInTemplate>
</asp:LoginView>

Here有一个对loginview控件的引用,你可以阅读

  

退出网站会清除用户的身份验证状态   当使用cookie时,将清除用户客户端的cookie   计算机。

所以我认为如果你不使用loginview控件,你必须手动清除cookie。