如何在PHP和ASP.net应用程序之间共享会话?

我的公司拿了一些旧的php应用程序。 由于我们偏爱ASP.net并且缺乏先前开发人员的任何文档,我们不希望花费太多资源来开发PHP。 为了实现新function,我们将创建一个与用户具有相同外观的Asp.net应用程序。 我们希望开发一种“共存”的Web应用程序。 因此,我们必须在PHP和Asp.net webapplication项目之间共享会话,因为存在涉及现有MySQL数据库的用户管理。

(例如,链接’A’指向PHP网站,链接’B’指向asp.net应用程序)

我们如何在PHP和asp.net应用程序之间共享会话?

有没有人对这种“共存”的东西有所暗示,这可能对开发有用吗?

编辑 :IIS 6将是我们的目标服务器,尽管IIS 7.5也是一个选项

我想告诉你,我最终是怎么做到的。

两个应用程序都访问一个MySQL数据库并访问一个“会话”表,该表包含一个Guid,用户的ID和一个confirmString(我猜我在其中编码了IDUser,不知何故)和一个日期。

会话仅由PHP应用程序启动(因为PHP应用程序仍然是主要应用程序)。 新会话将在日志表中生成新条目。 链接到ASP.Net应用程序的PHP应用程序中的每个链接都包含GET参数,包含Guid等。

如果GET参数指向现有会话,ASP.net应用程序将检查GET参数并在ASP.Net会话中设置IDUser。

指向PHP应用程序的链接使用相同的技术。

(还有其他需要考虑的事情,比如超时或注销,但也可以处理)

总而言之,我会说我的方法很有用,自部署以来没有客户抱怨(超过1年前)

我不认为在PHP和ASP.NET之间共享会话本身是可能的。

但是,可以通过使用读取会话内容的PHP页面,将它们存储在隐藏字段中,然后调用将读取这些字段并将它们加载到ASP.NET会话中的ASP.NET页面。

从理论上讲,它是可能的。

这是一个老问题,但我认为目前的答案都不完整。

首先,我认为将会话数据存储在数据库服务器(如mysql或SQL Server)中是一个坏主意。 数据库是一种宝贵的资源,并且没有理由仅针对会话数据进行颠覆。

如果你打算在这样的数据库中存储会话,有“更好”的方法,比如确保会话数据在它自己的独立磁盘上等等……但老实说,我仍觉得它是一个错误并将限制您的可扩展性。

对于存储会话,你想要一个简单的键/值存储,在我看来你不能击败memcached(虽然我也有幸与redis + nodejs)。

memcached的客户端可用于几乎所有语言: http : //code.google.com/p/memcached/wiki/Clients

所以,使用memcached时基本上你需要做的就是为密钥生成伪随机标记,然后执行memcached.set。 然后将该密钥存储在名为session-id或其他cookie的cookie中。

session-id cookie可以从任何服务器语言,.net,php,python等中读取 – 并且使用简单的memcached.get检索会话值。

查看memcached文档: http : //code.google.com/p/memcached/wiki/NewStart

这是一种非常简单且可扩展的会话方式,几乎可以与任何语言/服务器一起使用。

http://cz.php.net/manual/en/function.session-set-save-handler.php
http://support.microsoft.com/kb/317604

您可以将PHP的会话编写到MsSQL中,并将.NET配置为使用MsSQL作为会话的后端。

没有大碍。
你的asp应用程序应该做三件简单的事情:

  • 从客户端接收sessionid cookie
  • 在PHP会话保存路径中查找sess_文件
  • 实现PHP serialize / unserialize函数来读/写会话数据。

比攻击双方的会话存储机制更好的方法是设置OpenId提供程序并将OpenId消费者插入到asp.net和php应用程序中。

有很多现有的代码可以做到这一点。 它比低级解决方案更优雅,更容易出错。 作为奖励,您可以在公司的其他应用程序中使用集成的OpenId登录,并成为公司的英雄。

请参阅: 在.NET / Windows和PHP / Linux / Apache网站上使用OpenID

哦,亲爱的,也许有一天你会看到你的方式的错误,同时…..

默认情况下,PHP将其会话数据作为序列化数组写入根据会话命名的文件中。 会话通常由名为PHPSESSID的cookie标识。

所以在PHP中手动读取会话:

 $imported_session=unserialize(file_get_contents(session_save_path() . '/' . $_COOKIE[session_name()])); 

该文件的格式非常简单,易于解析。

然而,很容易实现自己的PHP会话处理程序,以任何格式将文件写入您喜欢的任何存储(看看如何将已撤销的代码与每个页面关联而不必重写每个页面的自动前置)。 或者更改用于存储会话的cookie的名称。

C。