ASP.Net MVC:使用windows身份验证处理应用程序会话

ASP.Net MVC : Handle session for application using windows authetication

本文关键字:身份验证 处理 应用程序 会话 windows 使用 Net MVC ASP      更新时间:2023-09-26

我在ASP中开发了一个应用程序。NET MVC,用于windows身份验证。我使用会话,临时数据类型的技术,在不同的请求中持久化数据。但是这里的问题是,当用户在会话中保持系统空闲超过20分钟时,由于会话超时,临时数据不再可用。

为了解决这个问题,我计划使用下面的代码。我将每20分钟发出一个ajax请求以保持会话。因此,即使用户空闲,系统也不会超时,并且用户可以从他之前离开的地方开始。
 setInterval(function () {
            $.ajax({
                url: url,
                datatype: 'json',
                async: true,
                cache: false,
                success: function () {
                       // alert("2 min");
                }
            });
        }, 1200000);

我想知道使用这种方法是否有任何优缺点。或者在这种情况下使用其他方法吗?

根据msdn

Timeout属性的值不能大于525,600分钟(1年)。默认值为20分钟。

增加会话超时时间将阻止服务器释放分配给非活动会话的内存。

缺点:如果您有大量的用户,并且随着会话超时的增加,您的非活动会话将保留在Web服务器内存中,这可能导致应用程序池回收,这将导致丢失所有用户的所有会话。

该值将取决于您的应用程序的临界,但您的web应用程序应该始终有断开连接超时,因为…大多数用户无法正常断开连接…

如果你调用的页面什么都不做,你的服务器不会遇到任何问题,对于中等数量的用户(低于1000个并发连接)。

您的ajax调用可以是一个选项,但更干净的场景将只是增加会话超时值。我不建议使用超过2小时,即使是非关键应用。在你的网里。配置:

<sessionState mode="StateServer" cookieless="false" timeout="120"/>

我会用不同的方式。我会将会话临时数据存储在SQL'其他存储中,并将其映射到ASP。净SessionID。当用户在网站上登录时,我会根据SessionID将他的临时数据存储在SQL中。此外,我会订阅Session_End事件(仅在InProc模式下工作),当会话超时(20分钟)时,我会根据会话更新DB中的数据。

然后经过几个小时的超时,当用户回到相同的浏览器会话-他的SessionID将是相同的,然后如果会话是空的,我将恢复数据从DB到新的会话,所以用户不会看到任何差异。如果他关闭浏览器并重新启动它,那么会话id将是新的,并且它将与您当前的方法相同。

我也会有一些任务,将清理旧的会话数据在DB不垃圾数据库。

所以在这种方法中,你的web服务器不会在AppPool进程内存中存储无用的会话数据数小时,也不会像你原来的问题那样得到大量的keep alive请求。

UPDATE:另一点是,默认情况下,IIS每24小时或20分钟后回收AppPool,所以在你的方法中,keep alive - session将在web应用程序启动24小时后死亡,keep alive请求不会保存它。在我的方法中,这并不重要,因为我们将临时会话数据存储在DB存储中,它将被很好地重新加载。