如何禁用ASP.NET的自动注销function

我使用ASP.NET成员资格API。 这会自动注销非活动会话。 我不希望这个自动注销。 我使用了一些工作,比如在指定的时间后调用ajax中的页面。 或者我使用iframe方法保持会话活动。 但这并不能很好地满足我的需求。 我想完全禁用此注销function。

注意我的问题是回应这篇文章

增加会话超时并不总是有效

乍一看,增加C#ASP .NET的web.config文件中的会话超时值应该可以解决问题。 您可以假设通过在下面的行中将超时值更改为60分钟,用户将保持登录Web应用程序会话整整60分钟。

    

但是,实际上存在两个问题。 第一个问题是将超时值设置为大于1小时的任何时间将导致服务器上保留过多的内存,因为IIS在会话期间保留所有会话内存。 想象一下,在高流量站点上超时值为5小时,保存数千个用户会话的所有会话数据。 第二个问题可能在测试应用程序时出现,通常Web应用程序仅在15分钟后就会超时。 究竟发生了什么? 虽然问题实际上可能是在IIS中为会话超时或连接超时属性配置的值(在共享主机的情况下,您甚至可能无法访问),但很明显我们需要将会话超时控制权转移到我们自己动手。

同样的事情发生在我们身上,原因是我们的服务器必须处理IIS中的超时(即IIS请求超时),我们没有任何特定的控制(在托管我的站点的服务器上)。

所以我们这样做了。 (不是很优化,但它对我有用。我希望你有一个母版页来完成所有这些。否则你必须在每一页都这样做)

假设你想要将超时增加到任意限制,比如1天

1.首先将web.config中的值增加到默认值。 20分钟。 最大值是一年。

2.在主页底部运行一个空的iframe。

3.在页面的代码隐藏,写

C#

 protected void Page_Load(object sender, EventArgs e) { //Session timeout is now at 20 minutes. due to the unreliable nature of session, //we are setting the meta-refresh to be 15 minutes to be on safer side. Response.AddHeader("Refresh", "900"); } 

VB.NET

 Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load 'Session timeout is now at 20 minutes. due to the unreliable nature of session, 'we are setting the meta-refresh to be 15 minutes to be on safer side. Response.AddHeader("Refresh", "900") End Sub 

是的,相当于添加刷新标头,我们在代码隐藏中使用变量操作15分钟值。 是的,

  

在ASPX页面上本身会很好。

4.在主页面上运行JavaScript计时器,该计时器将在24 * 60 * 60 *毫秒(即1天)到期。 到期时,将用户重定向到这样的注销页面。

 var timeOut = 86400000; //24 x 60 x 60 x 1000 ie, number of milli-seconds in a day $(document).ready(function () {//window.onload for you maybe? window.setTimeout(function () { window.location = "/LogIN.aspx?action=logout"; }, timeOut); }); 

逻辑是网站不会超时,因为超时有一个滑动到期,页面中的iframe将每15分钟刷新一次,从而重新设置会话到期时间。 现在,JavaScript计时器也在页面上运行,并且不知道页面中iframe发生的刷新,并且作为我们所需超时的超时裁判。 此外,它将在页面重新加载/导航远离时重新刷新,并重新启动计时器。

第一次听到有点太多了。 但这对我们有用,这是我们迄今为止找到的唯一解决方案(并非我们每天都在研究它:P)

希望这可以帮助。 快乐的会话黑客!

将身份validationcookie设置为不结束是非常危险的。

为什么,因为任何人都可以使用任何生成的经过身份validation的cookie再次登录。

要阅读更多相关内容,您可以阅读该文章:FormsAuthentication.SignOut方法不会阻止ASP.NET应用程序中的cookie回复攻击“

并查看一些相关问题, 表单身份validation – Cookie重放攻击 – 保护和FormsAuthenticationTicket无法使服务器端无效。 导致cookie回复攻击

一种解决方案是使用处理程序和一个简单的javascript来调用它并不时更新登录会话。

html / javascript部分:

   

keepsessionalive.ashx可以包含:

 // 1x1 transparent GIF private readonly byte[] GifData = { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00, 0x01, 0x00, 0x80, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x44, 0x01, 0x00, 0x3b }; public void ProcessRequest (HttpContext context) { // send the emtpy image context.Response.ContentType = "image/gif"; context.Response.Buffer = false; context.Response.OutputStream.Write(GifData, 0, GifData.Length); } 

如果您还希望将会话保持活动状态,请在身份validation时使用处理程序上的IRequireSessionState

在每次调用时,身份validation凭据都将续订,并且您的会话将保持不变 – 如果用户因任何原因等原因,cookie将过期并避免可能的重播攻击。

我还在这个类似的答案中介绍了自动图像重载的技巧:
保持相关ASP.NET应用程序的会话从另一个ASP.NET应用程序保持活动状态
重置会话超时而不在ASP.Net中进行回发
在asp.net中处理会话超时的最佳方法是什么
定义间隔后自动刷新ASP.NET网页?

将其添加到您的web.config: