2011-02-23 58 views
0

首先,請不要忽視這個問題 - 我知道這是一個醜陋的情況,但嘿,現實生活並不漂亮。從php檢測到過期的asp.net會話

我正在開發一個額外的部分到一個在asp.net中編寫的web應用程序,但在php中 - 它主要是完成的(這兩部分在數據庫之外並不真正相互通信 - 集成主要只是化妝品。)

我從PHP的一部分檢測時,.NET會話已過期,使其註銷用戶,並重定向到登錄頁面的唯一問題。

我相信asp.net應用程序是編譯的,但無論哪種方式,我不允許改變它,所以我想可能最好的辦法是做一個非常小/簡單的aspx頁面,輸出真正的或錯誤,我可以調用使用curl從PHP(並通過瀏覽器的cookie一起。)

這將甚至可能嗎?我不確定會話安全性如何在asp.net上工作,例如,一個.net應用程序是否可以讀取另一個會話變量,但是如果它是像php那樣的話,那麼它將成爲可能。

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

所以我的空間問題GET(與瀏覽器cookie)使用捲曲checksession,checksession簡單地返回一個true或false(或類似的東西)和我的頁面重定向到該網站的登錄頁面,如果這是假的。

php方面的驗證已經整理出來,並且與此問題分開。

所以真的,我需要知道的是我可以只是一個簡單的.aspx文件,做此檢查,如果是的話,我會去找出如何編程這樣一個簡單的頁面?如果它只是一條線,三,請你能不能讓我知道的那些行會是什麼(我很抱歉,我從來沒有做過任何.NET的東西..)

如果這是不可能的,那麼如果你不介意,你能否提供一些替代解決方案?謝謝!

- 編輯 -

花費最多的一天這個問題之後,我現在想的是使用PHP在所有來解決這個問題是一個壞主意。實際上有兩個級別的身份驗證(一個是普通的HTTP請求/響應登錄類型的事情,然後是.net會話) - 最重要的是我完全錯過了這一點,顯然這些會話幾乎肯定會由用戶瀏覽器的IP,我將不得不欺騙或者因捲曲而來的東西在服務器上運行。

所以我想我會在某個地方使用jQuery在我的網頁的頭以檢查和重定向嘀......莫名其妙:/

- EDIT 2 - 好了,JavaScript的方式了適合我的需求非常好 - 顯然這不是做事的安全方式,但幸運的是在這種情況下,它的確定,因爲這僅僅是在Intranet上使用的應用程序

+0

另一種更醜陋的替代方法是使用curl來查看返回的頁面是否是登錄頁面本身並從那裏開始......但這非常難看。 – 2011-02-23 01:27:35

+0

另一個更醜陋的事情就是使用curl來ping通aspx頁面以保持會話活着。 – 2011-02-23 01:28:15

回答

3

這裏有很多種方法。首先,單獨的cookie不會有太大的作用,因爲會話可以在ASP.net中過期,即使Cookie仍然存在。

ASP.net支持多種SessionStates,其中兩個是共同的:

  1. 處理中 - 在這裏,Web服務器(IIS通常)在內存中保存的所有會話。如果IIS服務重新啓動(默認情況下每24小時會發生一次,而不僅僅是系統重新啓動!),所有會話都會被清除(這就是爲什麼cookie本身不起作用)。這種情況是我認爲的默認情況,因此在單服務器環境中非常常見
  2. SQL Server - 這裏,會話數據存儲在SQL Server數據庫中。但這並不常用。
  3. 狀態服務器。這似乎非常罕見,所以我省略了它。

情況2是最好的選擇,因爲您只需從cookie中讀取會話標識並查詢SQL Server數據庫中的會話信息即可。

在場景1中,您的方法是正確的:您需要ASP.net應用程序(可以是.aspx頁面)的幫助。向PHP發送請求,傳遞會話cookie並檢查Session.SessionIDSession.IsNewSession以確保ID匹配和IsNewSession應該爲false - 否則,ASP.net只是重新創建一個新會話。

可能必須從ASP.net網頁會話交互來激活它(Session["PingFromPHP"] = true),這可以如果幹擾了ASP.net應用程序的鍵([] -brackets名稱)具有相同的名稱。

如果編譯ASP.net應用程序,將作爲代碼的.aspx.cs文件放在名爲App_Code的文件夾中,這應該允許您運行它。

希望能讓你開始。

+0

約翰亨特的解決方案也很有趣,可能更容易實現。這有點脆弱(如果302被加入服務器。如果使用Windows身份驗證,則傳輸或傳輸到401),但從實用的角度來看,它的實施速度非常快。 – 2011-02-23 03:20:57

+0

好的答案,但是我的解決方案更加貼切,考慮到我對這個項目有一個非常緊迫的截止日期,並且不知道任何.net的東西。如果我有時間留下來,我會回到這個。無論如何,改變了。 – 2011-02-23 03:29:53

1
(和他們進行身份驗證的用戶是可怕反正以次充好的方式。)

我不知道PHP,但如果這兩個應用程序都在同一個域名,你應該能夠讀取ASP.Net會話cookie,並確定它是否過期,因爲cookie是域名而不是web應用程序使用它,所以瀏覽r肯定會向cookie提供請求。

+0

非常好,謝謝! – 2011-02-23 01:32:49

+0

但是,cookie會顯示正在播放一個asp會話。實際到期將完全在服務器上完成。會話可能會被服務器端銷燬,但在用戶點擊其中一個asp頁面並獲得一個新的cookie之前,您永遠無法分辨。 – 2011-02-23 01:41:07

+0

然而,當您點擊頁面時,您可以檢查會話是否是新的。剛剛敲了一個HTTPHandler並寫了一個基於'context.Session.IsNewSession'的響應(編輯:哦,Michael已經提到了IsNewSession :)) – Phill 2011-02-23 03:18:51

1

這也許不是這個問題的正確答案..但我發現一個相當容易(稍微醜陋)的修復,這真是有點運氣..

我創建了一個名爲checksession.aspx和asp.net(或iis應用程序)的頁面,自動將該頁面重定向到登錄頁面(如果會話已過期)。使用curl我現在可以檢查我是否得到302重定向,如果有的話,我知道會話已過期。

Woot :)

+0

這似乎完全矯枉過正,應該寫了一個HttpHandler,它返回IsNewSession的結果,或者返回特定的Response狀態碼。 – Phill 2011-02-23 03:21:52