【问题标题】:ASP.Net Web API and ASP.Net Identity check sessionASP.Net Web API 和 ASP.Net 身份检查会话
【发布时间】:2023-03-15 03:00:01
【问题描述】:

我有一个单页应用程序,它必须向服务器发送一些查询(嗯,http get 或 post,等等)并了解会话是否仍然存在。

更具体地说,用户是否仍然登录。

我已将 SlidingExpiration 设置为 true,因此框架将在每次处理过期窗口一半的请求时重新发出一个新的 cookie,并将 ExpireTimeSpan 设置为 2 分钟。

我有一个如下所示的 api 控制器:

[System.Web.Http.RoutePrefix("api/session")]
[SessionState(System.Web.SessionState.SessionStateBehavior.Disabled)]

public class SessionController : ApiController
{
    [System.Web.Http.Route]
    public int GetSessionState()
    {
        return User.Identity.IsAuthenticated ? 1 : 0;
    }
}

即使在 10 分钟后,这个也总是返回 1。

我的猜测是 SessionState 属性不应该在这里工作。

所以经过相当多的研究后,我实际上不再确定问题的根源。我是唯一一个做这种事情的人吗?

有谁知道如何解决这个问题并满足要求?

谢谢,

【问题讨论】:

  • 难道是通过让您的应用程序执行对该控制器的调用,会话现在已刷新?我想该属性应该可以防止这种情况发生,但我认为您可以检查到期时间是否已过期或已更新?
  • 我尝试不发送呼叫,2 分钟后,如果我刷新页面,我就退出了。如果我发送电话,我永远不会退出。也许该属性不打算在 WebApi 控制器上使用。但是我很想知道我应该使用哪种属性/技术来让它在 WebApi 上工作
  • 所以我尝试了一个朋友的解决方案,该解决方案包括从响应中删除 Cookie。这是利用 SlidingExpiration 并确保浏览器不会获取更新的 cookie。但是,调试该解决方案时,我得到了 HttpContext.Current.Response.Cookies 为空的奇怪结果。我真的不明白那东西现在是如何工作的......
  • 好吧,显然 OWIN 在这里使用他自己的 cookie 存储 HttpContext.GetOwinContext().Response.Cookies... 但是,这仍然不包含我的会话 cookie...

标签: asp.net asp.net-mvc session asp.net-identity


【解决方案1】:

在我看来,您的问题的核心是如果必须使用 cookie 登录才能回答问题,服务器真的无法回答您是否应该登录它!在过去,我看到一个 javascript 函数给出了一个到期时间,它在一个已知的时间间隔内触发,并将当前时间与该时间进行比较,如果已经过去则注销。真的,这就是你要求服务器做的所有事情,不是吗?我将其设置为服务器设置参数,但客户端不依赖服务器执行。有意义吗?

【讨论】:

  • 您好菲利普,感谢您的回答。我的问题的核心是我使用单页应用程序。因此,如果用户让页面打开太久,当他回来并且会话超时时,他可能会遇到问题,因为导航事件是在客户端处理的,只有 API 调用到达服务器。所以我确实实现了一个成功的解决方案,对于特定的调用,从响应中删除 cookie(带有过滤器属性)但我的问题是,似乎 Asp.Net Identity / OWIN 在过程中很晚才添加该 cookie 并且所以我不能把它踢出去。
  • 对。在最近的一个项目中,我们处理它的方式是在客户端超时后,spa 被重定向(客户端)到登录页面。另一种变化是让您的 api 调用返回正确的代码,这些代码在错误处理程序中处理并理解 http 代码,很可能是 401,然后重定向到登录页面,或您的 spa 的登录状态
猜你喜欢
  • 2013-09-28
  • 2015-09-17
  • 1970-01-01
  • 2011-10-09
  • 2017-10-22
  • 2012-06-16
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多