我有两个网站将其视为 website1 和 website2 。
在website2中有一个登录页面。当用户点击登录按钮时,它将调用website1中的HTTPhandler来对用户进行身份验证。成功的身份验证用户信息将存储在处理程序的Session变量中。
然后它会重定向到网站1中的page1.aspx页面。但是先前设置的会话在page1.aspx中不可用。会出现什么问题?
我在第一个请求中检查了会话ID(当从网站2中调用网站1中的处理程序时)和第二个请求(从处理程序重定向到page1.aspx),会话ID不同。
如何保留会话数据?
答案 0 :(得分:3)
您需要将会话数据存储在与两个网站共享的另一个进程中。 你可以用不同的方式做到这一点:
在这两种情况下,您都必须更改两个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"/>
您无需更改代码。
答案 1 :(得分:1)
这种情况听起来类似于我之前经历过的工作,其中一个Web应用程序充当登录页面,而另一个是完成所有工作的实际应用程序。我可以描述我做了什么,希望你发现它有用。
和我一样,我有一个拥有登录页面的网络应用程序(因此在您的示例中,这将是 website2 )。提交登录表单后,我会重定向到 website1 中的假Login.aspx
页面 - 这是我们不同的地方我认为因为我不确定您使用{{1}的具体原因}}
就我而言, website2 HttpHandler
页面实际上只是进入Web应用程序的方式;它没有标记,只有代码隐藏,它将验证用户,执行设置(例如设置会话变量),然后重定向到另一个页面,如Login.aspx
。这个特殊的场景对我有用,所以也许你的问题围绕着Homepage.aspx
的使用,虽然我无法告诉你原因。
答案 2 :(得分:1)
为了在运行ASP.NET Web应用程序的两个不同服务器上保留相同的会话日期,您必须将会话状态配置为在进程外进行管理。这意味着实际的会话状态数据变量将存储在工作进程之外,并存储在能够使会话数据可用于其他计算机的另一个进程中。
要实现此目的,您可以将应用程序配置为使用SQL Server存储会话状态,并使其可用于服务器场中的多个服务器。 TechNet文章Configure a SQL Server to Maintain Session State (IIS 7)提供了有关这在IIS 7中完成的详细信息。
如果您使用的是IIS 6,那么配置步骤会有所不同,如果需要,我可以提供更多详细信息。
为了实现这一点,您需要确保两台服务器都在同一个域中运行应用程序,例如: myapp.com,否则ASP.Net会话cookie将不会在两个服务器之间传递。 ASP.Net使用cookie来查找存储在SQL Server中的会话状态,因此如果cookie没有在两个服务器之间的请求上传递,则不会找到任何匹配的会话。
答案 3 :(得分:1)
我认为IRequiresSessionState不会有帮助,因为上下文不同。 一旦我们遇到了同样的问题,那就是将asp会话varibles传递给.net。你怎么能在这里做到这一点。 在两个网站上创建一个页面setsession.aspx 现在,如果你在页面上说web1 / page5.aspx并想去web2 / page3.aspx 你重定向到web1 / setsession.aspx? togo1 = web2 / page3.aspx 在setsession.aspx逻辑中提取sessiondata并将它们放在querystring中
所以web1 / setsession将重定向到web2 / setsession.aspx?sess1 = value1&amp; sess2 = value2&amp; togo = page3.aspx
web2 / setsession.aspx将检查togo querystring,如果找到将提取所有查询字符串名称和值将在会话中设置它们,然后将重定向到togo值。
你需要区分togo1并谨慎行事。
答案 4 :(得分:1)
网站之间的会话共享将需要手动编码。您可以破解asp.net框架以使其正常工作,但我觉得这不是实现您所设定目标的简洁方法。
如果您正在通过网站进行用户身份验证,是否可以使用替代方案?单点登录机制将帮助您。
在这种情况下,像SAMLSSO这样的东西可以帮到你。答案 5 :(得分:1)
您有两个托管在不同服务器上的网站,这意味着您有两个不同的进程在不同的计算机上运行,因此会话肯定会有所不同。相同的会话不能跨进程共享,因为默认情况下asp.net支持内存中会话。
在这里,您需要考虑存储可在两个进程(即进程外)之间共享的会话信息。在数据库中存储会话信息的理想方式。为此,您可以考虑上面的Stefano Altieri代码示例。
答案 6 :(得分:0)
我认为您根本不想在两个网站之间共享会话信息。从我可以从评论中收集到的内容,您真正想要做的是让用户在一个网站中进行身份验证(给您一个经过验证的用户名和密码),然后将“登录”状态转移到另一个网站上不为自己处理身份验证。
您所描述的是委托身份验证模型。
在此模型中,您的应用程序将其身份验证交给其信任的其他系统以提供有关用户的信息。
有两种众所周知的协议可以提供这种机制:
OpenID
这旨在方便用户使用自己的身份提供商(Google,Facebook,Microsoft帐户)登录。如果您正在运行面向公众的网站,这是一个非常好的选择,因为大多数用户已经拥有了他们可以登录的帐户。
WS-Federation
这旨在方便用户使用由已知可信方(例如合作伙伴组织)管理的身份提供商登录。
从4.5版开始,.NET Framework通过Windows Identity Foundation组件内置了对WS-Federation的支持(并且作为单独的下载也可用于早期版本)。这样可以自动执行将身份验证委派给身份提供商的任务。
它还为您编写自己的身份提供者提供了组件,如果您想创建自己的身份提供者,但您不应该这样做;你可以找到各种现有的实现来为你完成这项工作。
你试图解决的问题是一个非常困难的问题,特别是试图让它足够安全可靠。好消息是,比你或我更聪明的人花了数年时间非常聪明地做这件事。你应该使用他们所做的事情,而不是试图拼凑出会话状态以外的东西。
从长远来看,最好让聪明的男人为你努力工作。