2010-04-11 41 views
0

在這個問題中,我問如何發佈到一個PHP文件形式的VB.NET應用程序:POST to webpage in vb.net (win forms, desktop, not ASP.net) 所以現在我已經登錄用戶用戶通過發佈他們的用戶名和密碼到PHP文件,然後php文件會執行安全性/檢查它們是否存在/ etc,如果用戶名和密碼都正確,則將用戶標識存儲在會話變量中。使用桌面應用程序的PHP會話

現在,如果vb.net應用程序嘗試下載數據從其中需要用戶登錄頁面時,它做檢查此:

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

然而,在應用程序會話變量已經正確登錄後沒有設置。 會話如何與這樣的vb.net應用程序一起工作?

當用戶成功登錄時,我應該下載用戶ID並將其保存在vb.net應用程序中,然後將其發佈到需要驗證的每個頁面上?

+1

貴vb.net應用程序處理Cookie? – 2010-04-11 11:20:26

+0

不,應該嗎? – 2010-04-11 11:28:06

+0

它應該處理Cookie或PHP會話ID,請參閱我的答案。 – 2010-04-11 11:44:08

回答

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。你可以很容易地寫一個'通用'的方法,如 字符串GetPage(字符串URL); 字符串PostPage(字符串URL,字符串PostData) 等

0

你應該基本上實現瀏覽器的會話管理功能。也就是說,您應該在您的URL中提供session-id(如果web服務器支持並允許)或者您應該將session-id存儲在cookie中,並且在執行HTTP請求時,您應該傳遞Cookie。這是首選的方法。

注意的System.Web包含做HTTP請求和接收HTTP響應,所以你不要有自己寫的一切,只是使用的類的命名空間,你可以實現它很容易類。

0

會議在PHP(和所有其他網絡平臺,我知道)以這種方式工作:

  • 客戶端發出第一個請求/發送的登錄數據
  • PHP創建客戶端會話,產生
  • 隨機會話ID爲「登錄」
  • PHP發送生成的會話ID到客戶端(通常通過一個Cookie)
  • PHP腳本標誌着會話
  • 客戶端發出後續請求和總是沿着SES發送錫永ID
  • PHP識別由會話ID,並加載會話數據的客戶端

如果您的客戶端發出請求,而不發送會話ID某種程度上,這將永遠是「沒有登錄」 - 會話ID是什麼讓PHP腳本「記住」它的狀態。

如果您的WebApp函數庫不處理會話cookie(我不熟悉vb.net編程和函數庫),尋找一個能夠或可能更簡單的函數庫,讓PHP腳本輸出會話ID成功登錄後。趕上打印在您的應用程序,並添加以下GET參數:

?PHPSESSID=123456 

(123456是您的會話ID)給你從你的應用PHP盡一切後續請求。這樣,PHP應該能夠識別正確的會話。正如我所說,我不熟悉VB.NET,所以可能會有更優雅的,現成的解決方案。但是如果沒有的話,這肯定會起作用。

0

讓您的桌面應用程序讀取PHP腳本在實際頁面內容之前發送的標題。

其中一個標題將是cookie數據,您需要存儲此數據,因爲每次從PHP腳本請求頁面時都需要發送該數據。

因此,您需要了解如何從響應中讀取標頭併爲請求寫入標頭。

如果這是爲你努力,那麼你可以通過URL GET參數傳遞數據,如:http://example.com/?loginid=12345