如何在 ASP.NET 中跨多个 Web 应用程序维护相同的会话 ID

Posted

技术标签:

【中文标题】如何在 ASP.NET 中跨多个 Web 应用程序维护相同的会话 ID【英文标题】:How to maintain the same session id across multiple web applications in ASP.NET 【发布时间】:2011-03-14 01:04:27 【问题描述】:

我在 IIS 上的不同虚拟目录上设置了两个相同的应用程序(我已经做了一些解决方法以确保它们都具有相同的应用程序名称)。有没有办法在两个 asp.net Web 应用程序之间共享会话 ID?

由于我将会话存储在 StateServer 中,因此它们都应该获取相同的会话数据,但是,每次我从应用程序 a 转到应用程序 b 时,都会创建不同的会话 ID。这不会在负载平衡场景中发生吗?当我去 www.test.com 时,它会将该请求重定向到服务器 a,然后如果我再次点击它,它将转到服务器 b,但由于它是一个不同的 Web 应用程序,它会创建一个新的会话 ID ?

【问题讨论】:

只需将其放入数据库即可。您正在向后弯腰以适应会话的限制。 除非我应用解决方法,否则数据库会出现同样的问题。由于它是数据库中的两个不同应用程序,因此它将有 2 个单独的会话。 你误解了我的建议。 根本不要使用会话,而是将所需的任何持久数据放在一个公共数据库中。会话和 cookie 旨在防止应用程序相互踩踏,这需要隔离。这是数据库的诸多优点之一。 【参考方案1】:

首先,将 web.config 中的 sessionState 元素配置为在两个应用中使用 cookieName="SOME_COOKIE_NAME_HERE"。

然后,只需确保 url 具有相同的 TLD(***域),即 app1.mydomain.com 和 app2.mydomain.com,您应该能够处理 Global.asax 中的 Session_Start 事件并将其放入代码:

    HttpCookie cookie = new HttpCookie("SOME_COOKIE_NAME_HERE", Session.SessionID.ToString());
    cookie.Expires = DateTime.Now.AddMinutes(20);
    cookie.Domain = "*.mydomain.com";
    cookie.HttpOnly = true;
    Response.SetCookie(cookie);

另外,我建议您使用 SqlServer SessionState 模式。

【讨论】:

有趣。应用此更改后,我会为每个请求获得一个新的会话 ID。这是我的 Global.asax 代码: void Session_Start(object sender, EventArgs e) HttpCookie cookie = new HttpCookie("SessionCookie", Session.SessionID.ToString()); cookie.Expires = DateTime.Now.AddMinutes(20); cookie.Domain = "*.keivantest.com"; cookie.HttpOnly = true; Response.SetCookie(cookie);这是我的 web.config 配置: 另外,在应用程序 A 中设置了 cookie 名称后,下次我转到应用程序 B 时,它的 session_start 会触发并用自己的会话 ID 覆盖“SessionCookie” 嗯.. 我不希望 Session_Start 在应用程序 B 中触发。我建议观察流量(提琴手等)以确保您将 cookie 从应用程序 A 发送到应用程序B. 我注意到您的状态服务器是 localhost - 两台机器都到达相同的状态服务器吗? 将域从 *.domain.com 更改为 domain.com 并开始工作。【参考方案2】:

最初我遇到了同样的问题。我所做的是,我覆盖了每个域的 jsession id。我的意思是,如果用户登陆 domain1.com,请从 iframe 为 domain2.com 设置相同的会话 ID。反之亦然。这样,您就可以跨多个域保持相同的会话。

您需要使用负载平衡器通过网络测试对多台服务器的影响。

【讨论】:

【参考方案3】:

您的目标是在 2 个应用程序之间共享会话状态,而不仅仅是会话 ID?我相信 StateServer 还使用应用程序路径以及 SessionID 来存储数据,因此即使 SessionID 相同,您仍然无法共享数据。您可能必须编写自己的会话模块。

负载平衡网络应用程序没有这个问题,因为应用程序路径在集群成员之间是相同的。

【讨论】:

你是对的。我正在使用 httpmodule 将两个应用程序的相同应用程序名称设置为相同的值。 他说他很麻烦地让应用程序名称相同

以上是关于如何在 ASP.NET 中跨多个 Web 应用程序维护相同的会话 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net Web 应用程序中连接多个数据库?

支持多个版本的ASP.NET Core Web API

我应该如何将多个参数传递给 ASP.Net Web API GET?

如何使用 JavaScript/jQuery 从 ASP.NET Web 窗体的 GridView 内部同时上传多个文件?

如何让 viewForZoomingInScrollView 在 Xcode 中跨多个 UIViewControllers 工作?

asp.net web.config中基于多个角色的文件夹授权