C# Http会话问题

C# Http会话问题,c#,asp.net,.net,session,visual-studio-2008,C#,Asp.net,.net,Session,Visual Studio 2008,我遇到了一个奇怪的问题。我开发了一个网站,它使用会话跟踪特定于用户的信息,以确定特定用户是否有权访问网站的某些部分。我正在使用VSTS2008+.NET3.5+C来开发ASP.Net网站 在我的设计中,当我访问时,如果没有可用的会话ID,将要求用户输入他们的用户名和密码(如果通过密码检查,将授予可用的会话ID);如果会话ID可用,则表示用户具有站点管理权限并经过身份验证,那么用户应该可以访问站点管理器中的所有功能,即所有登录用户都具有访问站点管理器的权限 麻烦的情况是这样的 我从一个新的IE窗口

我遇到了一个奇怪的问题。我开发了一个网站,它使用会话跟踪特定于用户的信息,以确定特定用户是否有权访问网站的某些部分。我正在使用VSTS2008+.NET3.5+C来开发ASP.Net网站

在我的设计中,当我访问时,如果没有可用的会话ID,将要求用户输入他们的用户名和密码(如果通过密码检查,将授予可用的会话ID);如果会话ID可用,则表示用户具有站点管理权限并经过身份验证,那么用户应该可以访问站点管理器中的所有功能,即所有登录用户都具有访问站点管理器的权限

麻烦的情况是这样的

  • 我从一个新的IE窗口访问,因为我以前没有登录过,我将使用我的凭据登录并授予站点管理权限
  • 然后我(不关闭IE)进入同一IE窗口的地址栏进行替换,Google AppEars
  • 然后我将地址粘贴到同一个IE窗口中进行访问,我很惊讶我没有请求输入密码的权限

  • 你知道怎么了吗?我想要的是在步骤(3)中,应该要求用户输入密码。

    您的会话并没有因为您离开了站点而结束。自上次与站点交互以来,会话在其超时期间保持活动状态。这就是会话信息仍然存在的原因


    要回答您的评论,您可以通过调用session.about()来结束会话。如果您想在有人离开站点时执行此操作,我建议您在页面的unload client事件上执行ajax调用,该事件将依次调用Session.about()或至少重置凭据。但是,这可能会很棘手,因为即使您将页面转到自己站点中的另一个页面,卸载也会被调用,因此您也必须进行检查。是的,这是设计的。除非您另行指定,否则默认会话超时为20分钟。

    您的会话不会因为您离开了站点而结束。自上次与站点交互以来,会话在其超时期间保持活动状态。这就是会话信息仍然存在的原因


    要回答您的评论,您可以通过调用session.about()来结束会话。如果您想在有人离开站点时执行此操作,我建议您在页面的unload client事件上执行ajax调用,该事件将依次调用Session.about()或至少重置凭据。但是,这可能会很棘手,因为即使您将页面转到自己站点中的另一个页面,卸载也会被调用,因此您也必须进行检查。是的,这是设计的。除非您另行指定,否则默认会话超时为20分钟。

    只有当用户删除服务器提供给他的会话cookie时,会话状态才会丢失。或者用户没有请求特定的(
    Session.TimeOut
    property)时间段。或者如果您在代码中放弃它。

    只有当用户删除服务器提供给他的会话cookie时,会话状态才会丢失。或者用户没有请求特定的(
    Session.TimeOut
    property)时间段。或者如果您在代码中放弃它。

    这就是web会话在任何地方工作的方式。避免让用户感到惊讶;你最好接受这种行为


    但是如果你真的想让你的用户在停止使用你的网站时注销,下面是如何

    我建议将会话超时时间缩短到1分钟,而不是使用卸载事件(这将是一个很难实现的问题,因为很难判断某人何时真的离开了您的站点-如果他们打开了两个访问您站点的窗口会发生什么情况?),使用客户端keepalive:本质上,浏览器每隔几秒钟(比如说,10秒)在预定的url上ping服务器,这除了保持会话活动外,什么也不做

    如果需要的话,可以完全不用javascript,通过iframe实现一个带有meta-refresh标记的页面。当然,在javascript中它会更加健壮和简单,但是隐藏的iframe并不太复杂,meta标记也不太复杂。如果服务器端刷新页面支持发送304 Not modified,那么您也将有一个非常低的开销解决方案

    在主文件中,您始终会包含以下内容:

    <iframe src="keepalive.aspx" width="1" height="1" />
    <!--and perhaps use css to hide the iframe - but test that!-->
    
    
    
    在keepalive.aspx中,您将包括:

    <meta http-equiv="refresh" content="5" />
    
    
    
    最后,作为带宽优化,在keepalive.aspx的代码中,可以添加上次修改的响应头,并检查浏览器是否发送了If Not Modified Since请求头,如果发送了,则发送304 Not Modified而不是完整文档


    最后,如果你无论如何都依赖javascript(许多这样的基于登录的web应用都是),你可以简单地使用你最喜欢的ajax框架来定期执行请求,而不需要iframe。

    这就是web会话在任何地方工作的方式。避免让用户感到惊讶;你最好接受这种行为


    但是如果你真的想让你的用户在停止使用你的网站时注销,下面是如何

    我建议将会话超时时间缩短到1分钟,而不是使用卸载事件(这将是一个很难实现的问题,因为很难判断某人何时真的离开了您的站点-如果他们打开了两个访问您站点的窗口会发生什么情况?),使用客户端keepalive:本质上,浏览器每隔几秒钟(比如说,10秒)在预定的url上ping服务器,这除了保持会话活动外,什么也不做

    如果需要的话,可以完全不用javascript,通过iframe实现一个带有meta-refresh标记的页面。当然,在javascript中它会更加健壮和简单,但是隐藏的iframe并不太复杂,meta标记也不太复杂。如果服务器端刷新页面支持发送304 Not modified,那么您也将有一个非常低的开销解决方案