【问题标题】:Detecting an expired asp.net session from php从 php 检测过期的 asp.net 会话
【发布时间】:2011-07-02 10:37:54
【问题描述】:

首先,请不要忽略这个问题 - 我知道这是一个丑陋的情况,但嘿,现实生活并不美好。

我正在为一个用 asp.net 编写的 web 应用程序开发一个额外的部分,但在 php 中 - 它大部分已完成(这两个部分在数据库之外并没有真正相互通信 - 集成主要只是化妆品。)

我唯一的问题是在 .net 会话过期时从 php 部分检测到,以便将用户注销并重定向到登录页面。

我相信 asp.net 应用程序已编译,但无论哪种方式我都不允许更改它,所以我想也许最好的办法是制作一个输出 true 或 false 的非常小/简单的 aspx 页面我可以使用 php 中的 curl 调用它(并传递浏览器的 cookie。)

这可能吗?我不确定会话安全如何在 asp.net 上工作,例如一个 .net 应用程序是否可以读取另一个的会话变量,但如果它是 php 之类的,那么它是可能的。

mypage.php --curl--> checksession.aspx --|
|                                        |
<----------- true / false <---------------

所以 mypage 使用 curl 发出一个 GET(带有来自浏览器的 cookie)来检查会话,检查会话只返回一个 true 或 false(或类似的东西),如果为 false,mypage 将重定向到站点的登录页面。

php端的认证已经整理好了,和这个问题是分开的。

所以说真的,我需要知道的是,我是否可以只拥有一个简单的 .aspx 文件来执行此检查,如果可以,我应该去哪里了解如何编写这样一个简单的页面?如果只是一三行,请告诉我这些行是什么(对不起,我从来没有做过任何 .net 的东西..)

如果这不可能,那么如果您不介意,您能否提供一些替代解决方案?谢谢!

-- 编辑--

在花了大部分时间处理这个问题之后,我现在认为完全使用 php 来解决这个问题是个坏主意。实际上涉及两个级别的身份验证(一个是正常的 HTTP 请求/响应登录类型的东西,然后是 .net 会话)——除此之外,我完全错过了显然这些会话几乎肯定会被我必须欺骗的用户浏览器的 IP 或来自 curl 的东西,因为它将在服务器上运行。

所以我想我将在页面标题中的某处使用 jQuery 来根据需要检查和重定向...不知何故:/

-- 编辑 2-- 好的,所以 javascript 方式非常适合我的需求 - 显然它不是一种安全的做事方式,但幸运的是,在这种情况下它没关系,因为这只是在内网上使用的一个应用程序(而且他们验证用户的伪劣方式很糟糕无论如何。)

【问题讨论】:

  • 另一个更难看的选择是使用 curl 来查看返回的页面是否是登录页面本身并从那里开始......但这很丑陋。
  • 另一件更丑陋的事情是只使用 curl 来 ping aspx 页面以保持会话处于活动状态..ug.

标签: php asp.net session cookies curl


【解决方案1】:

这里有多种方法。首先,cookie 本身不会有太大作用,因为在 ASP.net 中会话可能会过期,即使 Cookie 仍然存在。

ASP.net 支持多个SessionStates,其中两个是常用的:

  1. In Process - 在这里,Web 服务器(通常是 IIS)将所有会话保存在内存中。如果重新启动 IIS 服务(默认情况下每 24 小时发生一次,而不仅仅是在系统重新启动时!),所有会话都将被擦除(这就是 cookie 本身没有帮助的原因)。我相信这种情况是默认的,因此在单服务器环境中很常见
  2. SQL Server - 在这里,会话数据存储在 SQL Server 数据库中。不过这并不经常使用。
  3. 状态服务器。这似乎很罕见,所以我省略了它。

场景 2 是您最好的选择,因为您可以从 cookie 中读取会话 id 并查询 SQL Server 数据库以获取会话信息。

在场景 1 中,您的方法是正确的:您需要 ASP.net 应用程序的帮助,该应用程序可以是 .aspx 页面。从 PHP 发出一个请求,传入会话 cookie 并检查 Session.SessionIDSession.IsNewSession 以确保 ID Matches 和 IsNewSession 应该为 false - 否则,ASP.net 只是重新创建了一个新会话。

可能必须与 ASP.net 页面中的 Session 交互以激活它 (Session["PingFromPHP"] = true),如果您的键([] 括号中的名称)具有相同的名称。

如果编译了 ASP.net 应用程序,请将作为后面代码的 .aspx.cs 文件放入名为 App_Code 的文件夹中,这样您就可以运行它了。

希望能帮助您入门。

【讨论】:

  • John Hunt 的解决方案也很有趣,可能更容易实现。它有点脆弱(以防 302 被更改为 Server.Transfer 或使用 Windows Auth 时更改为 401),但从实用的角度来看,它的实现速度非常快。
  • 很好的答案,但是考虑到我的这个项目的截止日期非常紧迫并且不知道任何 .net 内容,我的解决方案更合适。如果我最后还有时间,我会回到这个。无论如何都修改了。
【解决方案2】:

我不知道 php,但如果两个应用程序都在同一个域上,您应该能够读取 ASP.Net 会话 cookie 并确定它是否已过期。因为 cookie 绑定到域而不是使用 web 应用程序它和浏览器肯定会在请求中提供 cookie。

【讨论】:

  • 然而,cookie 只会显示有一个 ASP 会话在运行。实际到期将完全在服务器上完成。会话可能会在服务器端被破坏,但在用户点击其中一个 asp 页面并获得新的 cookie 之前,您永远无法判断。
  • 您可以在点击页面时检查会话是否是新的。只需点击一个 HTTPHandler 并根据 'context.Session.IsNewSession' 写一个响应(编辑:哦,迈克尔已经提到 IsNewSession :))
【解决方案3】:

这可能不是这个问题的正确答案.. 但我发现了一个相当简单(有点难看)的修复方法,真的有点幸运..

我创建了一个名为 checksession.aspx 的页面,如果会话过期,asp.net(或 iis 应用程序)会自动将该页面重定向到登录页面。将它与 curl 一起使用,我现在可以检查是否收到 302 重定向,如果是,我知道会话已过期。

哇 :)

【讨论】:

  • 这似乎完全是矫枉过正,应该写一个返回IsNewSession结果的HttpHandler,或者返回特定的响应状态码。
猜你喜欢
  • 2010-12-02
  • 2010-09-05
  • 2011-06-19
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多