2009-02-15 93 views
1

我有兩個Web應用程序,有時需要用戶從一個應用程序跳轉到另一個應用程序。由於它們是兩個Web應用程序,可能駐留在不同的域/機器上,因此我無法在它們之間共享會話。重定向到ASP.Net中的另一個URL問題

我面臨的技術挑戰是如何將會話信息(我只需要在會話中傳遞用戶ID字符串信息)從一個源應用程序傳遞到另一個目標應用程序 - 以便用戶感覺單點登錄和個人信息是在兩個應用程序中爲他/她顯示(因爲用戶ID被傳遞到目標應用程序,不需要重新登錄)。

我目前的解決方案是在這兩個應用程序中生成所有URL字符串,並在用戶登錄成功後追加用戶ID,如http://www.anotherapplication.com/somepage?userID=someuserID,從會話中檢索userID值。但我認爲我的解決方案很愚蠢,我想找到一些方法來自動附加查詢字符串?userID = someuserID,當用戶跳轉到另一個應用程序中的另一個URL時 - 這樣我只需要生成共同的統一網址http://www.anotherapplication.com/somepage應用。

是否有解決方案來自動附加userID查詢字符串?

由於事先 喬治

回答

0

可以使用比是InProc別的東西(這是短期的過程)堅持會話。如果您使用SQL Server後端持久化會話,您將能夠檢索會話跨域/計算機(如果它們設置爲使用相同的SQL Server後端進行會話存儲)。這在ASP.NET中是可配置的,並且支持開箱即用。我建議你看看它。

+0

雖然這是真的,如果應用程序在不同的域上訪問;會話ID Cookie不能被其他應用程序訪問。 Asp .NET支持將會話ID存儲在查詢字符串中 - 但根據情況,這可能不可行。 – driis 2009-02-15 11:32:11

+0

有點困惑,因爲我之前沒有使用SQL Server存儲會話狀態。如何在不同域上的應用程序之間共享會話信息感到困惑?即當跳轉到另一個應用程序時,目標應用程序如何識別出您是George而不是John?跳轉時你必須傳遞一些信息? – George2 2009-02-15 11:34:30

+0

感謝driis,「Asp .NET支持將會話ID存儲在查詢字符串中 - 但根據情況,這可能不可行」 - 您是否有樣本? – George2 2009-02-15 11:35:08

2

,而不是通過查詢字符串這樣做,如果你使用創建的FormsAuthenticationTicket與所需的值可能是從長遠來看更容易維護。

我特別推薦閱讀SSO(單點登錄ONS)的主題邁克爾·莫羅佐夫的excellent article

2

我不認爲這是一個好主意,在查詢字符串中的用戶ID。

更好的想法是實施單點登錄解決方案。在你的情況,你可以做到以下幾點:

  • 每當你的應用程序中的一個接收未經認證的請求,將用戶重定向回其他應用程序,以一種特殊的單點登錄網址。
  • 此頁面檢查用戶是否已登錄,如果是,則使用查詢字符串將身份驗證令牌重定向回去。
  • 該令牌由未驗證的應用程序檢查;如果它通過,你可以登錄用戶。

當然,這看起來像很多重定向,但它應該是可靠的,它只發生一次,然後你的用戶將在這兩個應用程序進行身份驗證。

很明顯,你需要實現的安全方案,以便您可以檢查您獲得通過的認證令牌確實是有效的,從您的其他應用的業務。你可以用挑戰 - 響應算法來做到這一點;可能是:

  • 這兩個應用程序都應該知道一個公用密鑰。
  • 第一個應用程序向第二個應用程序發送一些隨機數據(「挑戰」)。
  • 第二個應用程序包括隨機數據的散列值+它的答案+密鑰在其響應中。
  • 現在第一個應用程序可以通過計算相同的散列值來檢查第二個應用程序是否知道密鑰。

看一看: http://en.wikipedia.org/wiki/Challenge-response_authentication

編輯:

至於會話狀態,看到http://msdn.microsoft.com/en-us/library/ms178581.aspx的概述。可以在應用程序之間共享會話狀態,但我不會推薦它。如果您的應用程序駐留在不同的域(URL)上,則必須使用無Cookie會話狀態;這是不安全的。如果您決定採取這種方式,您將不得不使用狀態服務器或SQL Server進行會話持久性,具體取決於您的設置。