Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何禁用ASP.NET的自动注销功能_C#_Asp.net_.net_Asp.net Membership - Fatal编程技术网

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

C# 如何禁用ASP.NET的自动注销功能,c#,asp.net,.net,asp.net-membership,C#,Asp.net,.net,Asp.net Membership,我使用ASP.NET成员API。这会自动注销非活动会话。我不想自动注销。我使用了一些变通方法,比如在指定的时间后在ajax中调用页面。或者我使用iframe方法保持会话处于活动状态。但这不太符合我的需要。我想完全禁用这个注销功能 注意 我的问题是针对这篇文章提出的 增加会话超时并不总是有效的 乍一看,增加C#ASP.NET的web.config文件中的会话超时值应该可以解决这个问题。您可以假设,通过将下面一行中的超时值更改为60分钟,用户将保持登录web应用程序会话整整60分钟 <auth

我使用ASP.NET成员API。这会自动注销非活动会话。我不想自动注销。我使用了一些变通方法,比如在指定的时间后在ajax中调用页面。或者我使用iframe方法保持会话处于活动状态。但这不太符合我的需要。我想完全禁用这个注销功能

注意 我的问题是针对这篇文章提出的

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

乍一看,增加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中为会话超时或连接超时属性配置的值(在共享主机的情况下,您甚至可能没有访问权限),但显然我们需要自己控制会话超时。

将此添加到您的web.config:

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

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

所以我们就这样做了。(虽然不是很理想,但它对我很有效。我希望你有一个母版页来完成所有这些。否则你必须在每一页上都这样做)

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

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

2.在母版页底部运行一个空的iframe

3.在页面后面的代码上写下

C#

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">
其逻辑是站点不会超时,因为超时具有滑动到期,页面中的iframe将每15分钟刷新一次,从而重新设置会话到期。现在,JavaScript计时器也在页面上运行,它不知道页面中iframe的刷新情况,并充当所需超时的超时裁判。此外,当页面被重新加载/导航离开并再次启动计时器时,它将被刷新

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


希望这有帮助。快乐会话黑客

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

为什么,因为任何人在任何时候都可以使用任何生成的经过身份验证的cookie再次登录

阅读更多你可以阅读的内容

看看相关的问题,还有

一种解决方案是使用一个处理程序和一个简单的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>
如果您还希望保持会话处于活动状态,请在处理程序上使用
IRequireSessionState

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

我还介绍了自动图像重新加载的技巧,回答类似:




可能的重复不是注销而是超时。您可以在web.config中设置秒数。web.config中没有设置吗?方法是增加会话状态持续时间..注销=会话结束,不注销=保留会话。是的,这没关系。。但我检查了这些方法,想为什么要使用这些技巧@spirals将超时/自动注销编码到成员资格提供程序类中。将超时设置为9999999将不会对您造成任何伤害,并将解决您的问题。@spirals您的用户将登录多长时间?直到浏览器关闭closed@SpiralsWhirls我认为设置超时是最好的方法。我不确定您的服务器正在运行哪种类型的硬件。您的服务器设置可能导致某些超时problems@naveen是的,ajax调用也是如此,但这在浏览器部分更便宜,工作更简单,更健壮,代码太少,不需要库。
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);
});
<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>
// 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);
}