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

时间:2013-05-27 17:53:03

标签: c# asp.net .net asp.net-membership

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

通知  我的问题是回应这篇文章This

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

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

<authentication mode="Forms">
  <forms name="MyAuth" timeout="60" protection="All" loginUrl="~/Web/Login.aspx" slidingExpiration="true" />
</authentication>

<sessionState mode="InProc" cookieless="false" timeout="60" />

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

3 个答案:

答案 0 :(得分:2)

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

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

假设您要将超时增加到任意限制,例如1天

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

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

<iframe id="SessionHandler" src="/html/SessionHandlerHack.aspx" frameborder="no" height="0" width="0"></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分钟值。是的,

<meta http-equiv="refresh" content="900">
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)

希望这会有所帮助。快乐会议黑客攻击!

答案 1 :(得分:2)

将身份验证cookie设置为not ends风险太大。

为什么,因为任何人都可以随时使用任何生成的经过身份验证的cookie重新登录。

要了解更多相关信息,请阅读that article :The FormsAuthentication.SignOut method does not prevent cookie reply attacks in ASP.NET applications"

并查看一些相关问题,Form Authentication - Cookie replay attack - protectionFormsAuthenticationTicket cannot be invalidated server side. Causing cookie reply attacks

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

html / javascript部分:

<img id="LiveImg" width="1" height="1" alt="" src="keepsessionalive.ashx?" /> 
<script>
var myImg = document.getElementById("LiveImg");
if (myImg){
    window.setInterval(function(){
          myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());
        }, 3000);
}
</script>

并且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);
}

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

在每次通话时,身份验证凭据都会续订,您的会话将会保留 - 如果用户出于任何原因,cookie将过期并避免可能的重播攻击。

我还在这个类似的答案中介绍了自动图像重载的技巧:
Keeping a related ASP.NET application's session alive from another ASP.NET application
Reset session timeout without doing postback in ASP.Net
What is the best approach to handle session timeouts in asp.net
Auto refresh ASP.NET web page after defined interval?

答案 2 :(得分:0)

将此添加到您的web.config:

<system.web>
<authentication mode="Forms">
      <forms timeout="99999999"/>
</authentication> 
</system.web>