4

我有两个网站将其视为website1website2

在 website2 中有一个登录页面。当用户单击登录按钮时,它将调用 website1 中的 HTTPhandler 来验证用户。成功验证后,用户信息将存储在来自处理程序的 Session 变量中。

然后它会重定向到website1中的页面page1.aspx。但是之前设置的会话在page1.aspx中不可用。会出现什么问题?

我在第一个请求(从 webiste 2 调用网站 1 中的处理程序时)和第二个请求(从处理程序重定向到 page1.aspx)中检查了会话 ID,会话 ID 不同。

如何保留会话数据?

4

8 回答 8

3

您需要将会话数据存储在与两个网站共享的另一个进程中。您可以通过两种不同的方式进行操作:

  1. 配置 SQL 服务器
  2. 配置 SessionState 服务,一个用于共享信息的 Windows 服务。

在这两种情况下,您都必须更改两个 web.config 文件以支持新的会话模式。即使用 SQL:

准备一个数据库(从命令提示符):

cd \Windows\Microsoft.NET\Framework\v4.0.30319
aspnet_regsql.exe  -ssadd -E -S localhost\sqlexpress

修改网页配置如下:

<sessionState mode="SQLServer"
        sqlConnectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=Test" allowCustomSqlDatabase="true"/>

您无需更改代码。

于 2013-01-17T16:47:18.967 回答
2

如果我错了,请纠正我,AFAIK 不同的域不能共享一个会话。处理此问题的一种方法是通过 cookie [加密值以确保安全] 将数据传送到另一个站点,然后将此 cookie 值复制到接收它的另一个站点的会话中并销毁 cookie。

如果站点位于不同的服务器中,您需要处理“粘性会话”,以便服务器共享会话。

于 2013-01-18T12:45:52.893 回答
1

这种情况听起来有点类似于我之前经历和工作过的情况,其中一个 Web 应用程序充当登录页面,而另一个是完成所有工作的实际应用程序。我可以描述我所做的,希望你觉得它有用。

像您一样,我有一个具有登录页面的网络应用程序(因此在您的示例中,这将是website2)。当登录表单提交后,我会重定向到website1Login.aspx中的一个假页面- 我认为这是我们不同的地方,因为我不确定您使用.HttpHandler

在我的例子中,website2 Login.aspx页面实际上只是进入 Web 应用程序的途径;它没有标记,只有代码隐藏,它将验证用户,执行设置(例如设置会话变量),然后重定向到另一个页面,例如Homepage.aspx. 这个特殊的场景对我有用,所以也许你的问题围绕着使用 aHttpHandler虽然我无法告诉你为什么。

于 2013-01-09T12:43:07.243 回答
1

我认为 IRequiresSessionState 无济于事,因为上下文不同。一旦我们遇到同样的问题,但就是将 asp 会话变量传递给 .net。你怎么也可以在这里做到。现在在这两个网站上创建一个页面 setsession.aspx 如果你在页面上说 web1/page5.aspx 并想去 web2/page3.aspx 你重定向到 web1/setsession.aspx?togo1 =web2/page3.aspx 在 setsession.aspx 逻辑中提取会话数据并将它们放在查询字符串中

所以 web1/setsession 将重定向到 web2/setsession.aspx?sess1=value1&sess2=value2& togo=page3.aspx

web2/setsession.aspx 将检查 togo 查询字符串,如果找到,将提取所有查询字符串名称和值,并将它们设置在会话中,然后重定向到 togo 值。

你需要仔细区分togo1和togo。

于 2013-01-17T06:58:30.703 回答
1

网站之间的会话共享将需要手动编码。您可以破解 asp.net 框架来使其正常工作,但我觉得这不是实现您所设定的目标的干净方式。

如果用户身份验证是您从网站上做的所有事情,是否可以使用替代方法?单点登录机制将在这里为您提供帮助。

在这种情况下,像SAMLSSO这样的东西可以帮助你。

于 2013-01-19T13:21:49.877 回答
1

您有两个托管在不同服务器上的网站,这意味着您有两个不同的进程在不同的机器上运行,因此会话肯定会有所不同。同一会话不能跨进程共享,因为默认情况下 asp.net 支持内存中会话。

在这里,您需要考虑存储可以在两个进程之间共享的会话信息(即进程外)。在数据库中存储会话信息的理想方式。为此,您可以考虑上面的 Stefano Altieri 代码示例。

于 2013-01-22T04:07:06.567 回答
1

为了在运行 ASP.NET Web 应用程序的两个不同服务器上保持相同的会话日期,您必须将会话状态配置为在进程外进行管理。这意味着实际的会话状态数据变量将存储在工作进程之外以及能够使会话数据对其他机器可用的另一个进程中。

为此,您可以将应用程序配置为使用 SQL Server 存储会话状态并使其可用于场中的多个服务器。TechNet 文章配置 SQL Server 以维护会话状态 (IIS 7)提供了有关在 IIS 7 中完成此操作的详细信息。

如果您使用的是 IIS 6,那么配置步骤会有所不同,如果需要,我可以提供更多详细信息。

为了使这个工作,您需要确保两台服务器都在同一个域中运行应用程序,例如 myapp.com,否则 ASP.Net 会话 cookie 将不会在两台服务器之间传递。ASP.Net 使用 cookie 来查找存储在 SQL Server 中的会话状态,因此如果 cookie 未在两个服务器之间的请求上传递,则不会找到任何匹配的会话。

于 2013-01-16T10:16:56.357 回答
0

我认为您根本不想在两个网站之间共享会话信息。根据我从评论中收集到的信息,您真正想做的是让用户在一个网站上进行身份验证(给您一个经过验证的用户名和密码),然后将该“登录”状态转移到另一个网站'不为自己处理身份验证。

您所描述的是委托身份验证模型。

在此模型中,您的应用程序将身份验证移交给它信任的其他系统,以提供有关用户的信息。

有两个众所周知的协议可以提供这种机制:

OpenID
这旨在方便用户使用自己的身份提供者(Google、Facebook、Microsoft 帐户)登录。如果您正在运行面向公众的网站,这是一个非常好的选择,因为大多数用户已经拥有可以登录的帐户。

WS-Federation
这旨在帮助用户使用由已知可信方(例如合作伙伴组织)管理的身份提供者登录。

从版本 4.5 开始,.NET Framework 通过Windows Identity Foundation组件内置了对 WS-Federation 的支持(并且还可以单独下载早期版本)。这会自动将您的身份验证委托给身份提供者的任务。

如果您想创建自己的身份提供程序,它还提供组件供您编写自己的身份提供程序,但您不必这样做;您可以找到各种现有的实现来为您执行这项工作。


您尝试解决的问题是一个非常困难的问题,尤其是尝试使其足够安全以使其可靠。好消息是,比你或我更聪明的人已经花了数年时间研究出非常聪明的方法来做到这一点。您应该使用他们所做的事情,而不是试图拼凑一些超出 Session 状态的东西。

从长远来看,最好让更聪明的人为你做艰苦的工作。

于 2013-01-22T11:52:42.067 回答