【问题标题】:PHP Session when using desktop app使用桌面应用程序时的 PHP 会话
【发布时间】:2011-02-06 16:36:40
【问题描述】:

在这个问题中,我询问了如何从 vb.net 应用程序 POST 到 php 文件:POST to webpage in vb.net (win forms, desktop, not ASP.net) 所以现在我通过将用户名和密码发布到 php 文件来登录用户用户,然后 php 文件执行安全性/检查它们是否存在/等,如果用户名和密码都正确,则将用户 ID 存储在会话变量中.

现在,如果 vb.net 应用程序尝试从需要用户登录的页面下载数据,它会通过以下方式检查:

if (!isset($_SESSION['uid'])) {
    header("Location: index.php");
}

但是,在应用程序中正确登录后,会话变量未设置。 像这样的 vb.net 应用程序如何使用会话?

当用户登录成功后,我应该下载用户id并将其保存在vb.net应用程序中,然后将其发布到需要身份验证的每个页面吗?

【问题讨论】:

  • 您的 vb.net 应用程序是否处理 cookie?
  • 它应该处理 Cookie 或 PHP 会话 ID,请参阅我的回答。

标签: php vb.net authentication session


【解决方案1】:

让您的桌面应用程序在实际页面内容之前读取 php 脚本发送的标题。

其中一个标头将是 cookie 数据,您需要存储它,因为您需要在每次从 php 脚本请求页面时发送它。

因此,您需要了解如何从响应中读取标头并为请求写入标头。

如果这对您来说很难,那么您可以通过 url GET 参数传递数据,例如:http://example.com/?loginid=12345

【讨论】:

    【解决方案2】:

    要让您的 PHP 网站将 VB.NET 客户端识别为登录用户,您需要发送一个 cookie。当您在 PHP 中使用 session_start() 时,PHP 将在访问者 cookie 中设置一个随机 ID 来链接会话。你需要知道的是这个ID是什么。更具体地说,在您第一次向网站提出请求时,您应该阅读此内容。

    在您的其他问题中,我看到您正在使用 WebClient 实例。如果您发送了请求,还有一个名为 ResponseHeaders 的属性。这是一个包含来自网络服务器(在本例中为运行您的站点的网络服务器)的响应标头的集合。这也可能包含一个 cookie 代码。

    例如:

    Dim myWebClient As New WebClient
    
    Dim responseArray = myWebClient.UploadData("http://...", "POST", Encoding.ASCII.GetBytes(postData))
    Dim MyCookie As String = cl.ResponseHeaders.Item(HttpResponseHeader.SetCookie)
    
    myWebClient.Headers.Add(HttpRequestHeader.Cookie, MyCookie)
    

    在这个例子中你必须处理responseArray,但这是存储cookie并将其发回的基本原理。您使用此 WebClient 的同一实例发出的下一个请求将包含您的站点用最后一个请求响应的 cookie。基本上这意味着,PHP 站点创建的 SessionID 将被加入并发回。

    我个人会围绕这个写一个小包装类。只需创建一个向您的特定站点发送登录请求的功能。然后存储 cookie,以后发送的每个请求都添加这个 cookie。您可以轻松编写一个“通用”方法,例如 字符串 GetPage(字符串 URL); 字符串 PostPage(字符串 URL,字符串 PostData) 等等

    【讨论】:

      【解决方案3】:

      PHP 中的会话(以及我知道的所有其他 Web 平台)都是这样工作的:

      • 客户端发出第一个请求/发送登录数据
      • PHP 为客户端创建会话,生成随机会话 ID
      • PHP 脚本将该会话标记​​为“已登录”
      • PHP 将生成的会话 ID 发送到客户端(通常通过 cookie)
      • 客户端发出后续请求并始终发送会话 ID
      • PHP 通过会话 ID 识别客户端并加载会话数据

      如果您的客户端发出请求而未以某种方式发送会话 ID,则它将始终“未登录” - 会话 ID 使 PHP 脚本“记住”其状态。

      如果您的WebApp 库不处理会话 cookie(我不熟悉 vb.net 编程和库),请寻找一个库,或者 - 也许更容易 - 让 PHP 脚本打印出会话登录成功的ID。在您的应用程序中捕获该打印输出,并添加以下 GET 参数:

      ?PHPSESSID=123456
      

      (123456 是您的会话 ID)到您从应用程序向 PHP 发出的每个后续请求。这样,PHP 应该能够识别正确的会话。

      正如我所说,我不熟悉 VB.NET,因此可能有更优雅、现成的解决方案。但是,如果没有,这肯定会起作用。

      【讨论】:

        【解决方案4】:

        您应该基本上实现浏览器的会话管理功能。也就是说,您应该在 URL 中提供 session-id(如果网络服务器支持并允许这样做),或者您应该将 session-id 存储在 cookie 中,并且在执行 HTTP 请求时,您应该传递 cookie。这是首选方法。

        请注意,System.Web 包含用于执行 Http 请求和接收 Http 响应的类,因此您不必自己编写所有内容,只需使用该命名空间中的类即可轻松实现。

        【讨论】:

          猜你喜欢
          • 2011-01-14
          • 2016-01-19
          • 2013-07-18
          • 1970-01-01
          • 2012-12-16
          • 1970-01-01
          • 1970-01-01
          • 2018-06-13
          • 1970-01-01
          相关资源
          最近更新 更多