【问题标题】:Log a user off when ASP.NET MVC Session expiresASP.NET MVC 会话过期时注销用户
【发布时间】:2018-03-12 03:26:21
【问题描述】:

在 WCF 服务之一的 ASP.NET MVC 中,我将一个对象放入 HttpContext.Current.Session 对象中。

当会话超时并且会话中的所有对象都被清除时,我想注销用户但无法找到方法。

在 Global.asax 中

当调用 Session_end 方法时,Response 对象和 HttpContext.Current 都为 null。

感谢任何如何注销用户的想法。

【问题讨论】:

  • 这不取决于您最初是如何实施会员资格的吗?
  • 抱歉我的无知,只是维护现有的工作,而不是了解所有内容。有一个带有 Login 方法的 Controller,它使用 ttpContext.GetOwinContext().Authentication 并分别调用 SignIn 和 SignoOut 方法来登录和注销用户。我不确定如何从 Global.asx 文件中调用此控制器,或者通常仅在会话到期时调用此控制器。
  • 这将是手动的,没有自动功能。您必须检测到没有会话,并调用相应的代码来确定注销。
  • 您使用什么身份验证方案(表单、WebSecurity、身份等)?
  • 您能否进一步描述“注销用户”的含义?如果会话已过期,则用户已离开。您是否需要进行一些服务器端清理工作?

标签: asp.net-mvc session authentication


【解决方案1】:

当会话超时时,无论如何用户都不再存在。如果您要做的是清理打开的浏览器窗口,则需要根据会话到期前的剩余时间实现一个计时器。

登录和注销与添加或删除 cookie 或令牌以通过外部服务进行身份验证有关。您看到的调用应该在登录控制器中,并且不应移动到 global.asax。

无需额外操作。

【讨论】:

    【解决方案2】:

    我认为尝试使会话和身份验证 cookie 保持同步是错误的做法。会话和cookie是不同的东西。您可以在同一会话期间与多个用户一起登录。当您打开某个 url 时,您开始一个新会话,并在您关闭窗口或在服务器端过期时结束。更多session-authentication cookie关系请阅读以下答案:asp.net cookies, authentication and session timeouts

    无论如何,如果你想这样做,你可以使用一个小技巧。您必须通过 ajax 调用定期调用您的服务器,例如每 n 秒调用一次 YourWebsite.com/chcecksession 页面。在那里,您必须检查会话变量是否存在。如果它不再存在,那么只需调用 FormsAuthentication.SignOut(),刷新你的页面,用户就会被注销。

    【讨论】:

    • 使用声明来添加有关用户的更多信息而不是 cookie 有什么问题吗?
    • @TheWommies 声明旨在存储用户相关信息,因此可以使用它们。
    • 谢谢,只是好奇不定期轮询服务器只是重置会话超时?因此,如果用户处于非活动状态,会话将永远不会过期
    • @TheWommies 是的,它会在每次请求后重置会话超时,但你不能依赖它,因为它也会在应用程序池重新启动或更改 web.config 时过期
    【解决方案3】:

    我不确定您是否植入了 WCF,因为我对 WCF 不太熟悉。我目前正在构建一个大型奖学金应用程序,我们希望将登录限制为每个用户一次登录。我有一个表设置来跟踪我存储在他们的 Auth Cookie 中的用户 ID 和 GUID。您可以改用会话 ID。每次添加或删除条目时,我都会缓存表并刷新缓存。我正在使用 SignalR(您可以获取 NuGet 包)来维护与我们每个客户的连接。当他们关闭浏览器时,SignalR 可以立即报告用户离开了,我可以从会话跟踪表中终止他们的记录。在您的情况下,您可以终止会话。此外,如果用户尝试再次登录,我可以看到他们已经登录。然后我终止他们的原始会话并允许他们重新登录。

    花了几个小时才习惯使用 SignalR,我强烈推荐 Plural Sight 上的视频。

    【讨论】:

      【解决方案4】:

      将以下配置中的两个超时设置为确切的分钟数。确保将slidingExpiration设置为true,这与每次请求后身份验证将继续延长至30分钟相同,因为会话在每次请求后继续延长。

      <authentication mode="Forms">
        <forms loginUrl="~/Auth/SignOn.aspx" timeout="30" slidingExpiration="true" />
      </authentication>
      
      <sessionState timeout="30" />
      

      【讨论】:

      • 代码使用 ApplicationCookie 如下代码所示 有没有办法在应用程序启动后更改 ExpireTimeSpan?这取决于用户登录的内容,因为我想设置超时 app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, AuthenticationMode = AuthenticationMode.Active, LoginPath = new PathString("/Account/Login") ExpireTimeSpan = TimeSpan.FromSeconds(5) });
      猜你喜欢
      • 1970-01-01
      • 2018-03-01
      • 2011-11-14
      • 2012-04-19
      • 2019-10-11
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      相关资源
      最近更新 更多