6

我正在开发一个带有安全部分的网站,即名为“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

4 回答 4

4

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

FormsAuthentication.SignOut();
Session.Abandon();
Response.Redirect("~/Default.aspx", true);
于 2012-07-30T10:09:17.510 回答
2

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

您的网页是否设置了过期时间?如果没有,该页面可能仍在您的浏览器缓存中,并且不会调用服务器上的表单身份验证检查。

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

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

    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";
    }
于 2012-07-30T11:11:17.647 回答
2

设置过期的cookies:

HttpCookie cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
cookie.Expires = DateTime.Now.AddYears(-1);
HttpContext.Current.Response.Cookies.Add(cookie);
于 2015-08-03T12:36:38.307 回答
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>

这里有一个 loginview 控件的参考,你可以读到

退出网站会清除用户的身份验证状态,并且在使用 cookie 时会从用户的客户端计算机中清除 cookie。

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

于 2012-07-30T10:02:26.453 回答