ASP.Net:如果我有Session ID,能获取到Session对象吗?

14
这个问题与这个问题有关,尽管我认为我在那里过于冗长,没有得到一个好的答案。我会简短地介绍一下。
我正在开发一个 Web 处理程序 (ashx),它接受来自 aspx 页面的表单提交。当处理程序接收到这个表单提交时,为了完成它需要做的工作,它需要知道已登录的用户 (User.Identity.Name),但我无法依赖于浏览器发送的 cookies。
我知道我可以获取 Session.SessionID 并将其放入一个隐藏的表单字段中,但一旦我的处理程序接收到表单提交,如何使用该 SessionID 来确定已登录用户的身份?
我正在使用 StateServer 模式进行会话状态。
4个回答

3

一个很好的提示,但这仍然依赖于浏览器发送 ASP.NET_SessionId cookie,而我不能依赖它。我需要一种手动将 SessionId 传递到处理程序的方法。 - Josh Hinman

1

3
乔纳斯的链接似乎已经失效了。 - Whimsical
1
Wayback Machine上找到了链接。 - shamp00

1

除非有必要直接使用会话,否则您可以始终将有关已登录用户身份的任何信息存储在单例字典或缓存中,并通过存储在隐藏字段中的SessionID引用它。我个人认为这存在安全问题,但不会深入讨论。对于此类实现,我会考虑发放一次性身份。


1
好主意,但是在哪里存储这个单例字典呢?应用程序对象不会分发到农场中的其他Web服务器(甚至是Web Garden中的其他进程线程),SQL数据库是一个选择,但我希望有更优雅的解决方案。 - Josh Hinman
SQL Server可能是您的最佳选择。如果您已经在使用状态服务器,那么这将会有类似的惩罚。或者您可以编写自己的WCF服务来处理此交换。它可以作为唯一ID代理以及身份存储。甚至可以使用SQL端点服务。 - Adam Carr

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接