【问题标题】:ASP.Net: If I have the Session ID, Can I get the Session object?ASP.Net:如果我有 Session ID,我可以得到 Session 对象吗?
【发布时间】:2010-09-08 12:10:45
【问题描述】:

这个问题与this one 有关,尽管我认为我在那里有点啰嗦,无法真正得到一个好的答案。我会保持简短。

我正在开发一个接受来自 aspx 页面的表单发布的 Web 处理程序 (ashx)。当处理程序收到此表单发布时,为了做它需要做的事情,它需要知道登录的用户(User.Identity.Name),但我不能依赖浏览器发送的cookie。

我知道我可以获取 Session.SessionID 并将其放置在隐藏的表单字段中,但是一旦我的处理程序收到表单帖子,我如何使用该 SessionID 来确定登录用户的身份?

我正在为会话状态使用 StateServer 模式。

【问题讨论】:

    标签: asp.net session


    【解决方案1】:

    乔纳斯在这里发布了一个很好的答案:

    Can I put an ASP.Net session ID in a hidden form field?

    【讨论】:

    【解决方案2】:

    除非需要直接使用会话,否则您始终可以将有关登录用户身份的任何信息存储在单例字典或缓存中,并通过存储在隐藏字段中的 SessionID 引用它。我个人在这方面看到了安全问题,但不会涉及这些问题。我会考虑为这种类型的实现发布一次性身份。

    【讨论】:

    • 好主意,但是在哪里存储这个单例字典? Application 对象不会分发到场中的其他网络服务器(甚至网络花园中的其他进程线程),sql 数据库是一种选择,但我希望有更优雅的东西。
    • SQL 服务器将是您的最佳选择。如果您已经为此使用状态服务器,那将是类似的惩罚。或者,您可以编写自己的 WCF 服务来处理此交换。它可以用作唯一 ID 代理以及身份存储。甚至使用 SQL 端点服务。
    【解决方案3】:

    在 HttpHandler 或 HttpModule 实现中,您不能总是从 BeginRequest 事件访问会话。您可以处理另一个事件,称为 OnAcquireRequestState。如果您在该事件中编写代码,则 HttpContext.Current.Session 不会为空。

    【讨论】:

      【解决方案4】:

      我认为你可以在 HttpHandler 上实现 IReadOnlySessionState 接口

      【讨论】:

      • 一个很好的提示,但这仍然依赖于浏览器发送 ASP.NET_SessionId cookie,我不能依赖它。我需要一种手动将 SessionId 传递给处理程序的方法。
      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 2012-04-04
      • 1970-01-01
      • 2023-04-02
      • 2012-04-29
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多