0

您好,我创建了一个具有 asp.net 4.5 和 asp.net 成员资格的网站应用程序。如果用户不使用网站(如 Facebook),我希望用户会话过期。

我已经web.config为会话设置了超时,但是这个时间已经完成(超时),无论是用户工作还是不工作。有什么我想念的吗?

<authentication mode="Forms">
  <forms loginUrl="~/Pages/Login.aspx" slidingExpiration="true" timeout="1"></forms>
</authentication>
4

2 回答 2

0

在设置表单身份验证 cookie 时,您需要设置 cookie 的到期时间并在应用程序中创建一个 http 模块,您可以在其中检查请求标头中的身份验证 cookie,如果它不存在,则注销用户并重定向到登录页面。如果 cookie 存在,只需在响应中重置 cookie 的到期时间。

于 2013-09-21T10:19:21.053 回答
0

请参阅此链接。这是一个回答,我目前正在帮助另一个用户。这应该向您展示如何在用户登录后启动会话。

编辑:不知道为什么投反对票,但这里是代码。

更改每个表单身份验证和 sessionState 的超时,如下所示。

<authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" defaultUrl="~/Dashboard.aspx" timeout="60"/>
    </authentication>
    <sessionState timeout="60" mode="InProc" cookieless="false" />

然后,将其放入页面加载下的 Site.Master.cs 中。

if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                // Handle the session timeout 
                string sessionExpiredUrl = Request.Url.GetLeftPart(UriPartial.Authority) + "/DealLog/Account/SessionExpired.aspx";
                StringBuilder script = new StringBuilder();
                script.Append("function expireSession(){ \n");
                script.Append(string.Format(" window.location = '{0}';\n", sessionExpiredUrl));
                script.Append("} \n");
                script.Append(string.Format("setTimeout('expireSession()', {0}); \n", this.Session.Timeout * 60000)); // Convert minutes to milliseconds 
                this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "expirescript", script.ToString(), true);
            }

只有在用户通过身份验证时,会话才会过期。用户登录,变为非活动状态,然后会话超时。一旦超时,就会转到 SessionExpired 页面。在会话过期页面上,放置

FormsAuthentication.SignOut();

在页面加载中,因此它会注销用户。然后,您可以从那里设置重定向。Authentication 和 SessionState 超时都以分钟为单位。60 = 1 小时。

编辑 2:看起来我的答案中链接的问题的用户已被用户删除。对此感到抱歉。希望这会有所帮助。

于 2013-09-23T20:22:21.133 回答