在这个问题中,我问如何从一个vb.net应用程序发送到php文件:POST to webpage in vb.net (win forms, desktop, not ASP.net) 所以现在我通过将他们的用户名和密码发布到php文件登录用户用户,php文件然后执行安全/检查他们存在/ etc,如果用户名和密码都正确则将用户ID存储在会话变量中
现在,如果vb.net应用程序试图从需要用户登录的页面下载数据,它会通过执行以下操作来检查:
if (!isset($_SESSION['uid'])) {
header("Location: index.php");
}
但是,在正确记录应用程序后,未设置会话变量。 会话如何与这样的vb.net应用程序一起工作?
当用户成功登录时,我应该下载用户ID并将其保存在vb.net应用程序中,然后将其发布到需要身份验证的每个页面吗?
答案 0 :(得分:0)
您应该基本上在会话管理方面实现浏览器的功能。也就是说,您应该在URL中提供session-id(如果Web服务器支持并允许这样做),或者您应该将session-id存储在cookie中,并且在执行HTTP请求时,您应该传递cookie。这是首选方法。
请注意,System.Web包含用于执行Http请求和接收Http响应的类,因此您不必自己编写所有内容,只需使用该命名空间中的类,即可轻松实现它。
答案 1 :(得分:0)
PHP中的会话(以及我所知道的所有其他网络平台)以这种方式工作:
如果您的客户端在没有以某种方式发送会话ID的情况下发出请求,它将始终“未登录” - 会话ID是使PHP脚本“记住”其状态的原因。
如果你的WebApp
库没有处理会话cookie(我不熟悉vb.net编程和库),那么找一个可以或者 - 或者更容易 - 打开PHP脚本的库成功登录时的会话ID。在您的应用中捕获该打印输出,并添加以下GET参数:
?PHPSESSID=123456
(123456是您的会话ID)来自您从应用程序到PHP的每个后续请求。这样,PHP应该能够识别正确的会话。
正如我所说,我不熟悉VB.NET,因此可能会有更优雅,现成的解决方案。但如果没有,这肯定会起作用。
答案 2 :(得分:0)
要让您的PHP网站将VB.NET客户端识别为已登录用户,您需要发送cookie。当您在PHP中使用session_start()时,PHP将在访问者cookie中设置随机ID以链接会话。你需要知道的是这个ID是什么。更具体地说,在您第一次访问该网站时,您应该阅读此内容。
在您的其他问题中,我看到您正在使用WebClient实例。如果您发送了请求,那么还有一个名为ResponseHeaders的属性。这是一个包含来自Web服务器的响应头的集合(在这种情况下是运行您站点的Web服务器)。这也可能包含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添加到其中。您可以轻松编写一个“通用”方法 string GetPage(string URL); string PostPage(字符串URL,字符串PostData) 等
答案 3 :(得分:0)
让你的桌面应用程序读入php脚本在实际页面内容之前发送的标题。
其中一个标题将是cookie数据,您需要存储它,因为每次从php脚本请求页面时都需要发送它。
因此,您需要了解如何从响应中读取标头并为请求写入标头。
如果这对您来说很难,那么您可以通过url GET参数传递数据,例如:http://example.com/?loginid=12345