2009-08-20 126 views
2

我使用WCF連接創建Silverlight。我想在Silverlight中用戶登錄後創建並維護一個會話,並執行以下操作。在Silverlight中維護會話

  • 成功登錄,創建一個會話對象和存儲會話ID,用戶ID,用戶名,會話狀態
  • 在與WCF還呼籲,會話信息需要從Silverlight的傳遞給WCF

一個解決方案是創建會話對象並將其作爲參數傳遞給所有方法。

是否有任何其他方式在沒有傳遞成員變量的情況下在所有Web服務調用中傳遞信息?

類似於ASP.NET中的持久會話對象。

回答

3

爲什麼要每次都傳遞會話信息?

如果您使用ASP.NET以ASP兼容模式託管您的WCF服務,則可以將實例化模式設置爲Session,然後將所有內容存儲在您的WCF服務實例變量中。或者在你的ASP會話對象中。

我不明白你的意思是在發送每個請求的所有數據。

在ASP.NET中使用SL時要做的一件好事是使用ASP.NET內置身份驗證Like here進行登錄,然後您可以調用WCF服務並檢查HttpContext.Current.User.Identity.IsAuthenticated是否爲true。

+1

Silverlight的事情是它只支持BasicHttpBinding,它不允許你將實例化模式設置爲Session。 – Phil 2010-09-22 14:15:02

+0

你確定嗎?我確實在服務器端獲得會話GUID。我實際上並沒有嘗試過「爲每個會話創建一個新的實例」行爲,因爲我手動完成了所有的對象鎖定。 – R4cOON 2010-09-24 12:51:46

0

好的第一個,silverlight不是asp.net,WCF設計是無狀態的,除非另有構造才能保持狀態。

然後,如果你想保持Silverlight 3中的狀態,你可以創建一個靜態屬性的靜態類,並在頁面中維護這些值。但這不是一個優雅的解決方案。這是可能的,因爲SL是客戶端運行時,並且您的應用程序存在於導航到url時下載的xap程序集中,所以基本上它就像下載了Windows桌面應用程序,然後在受限制的安全上下文中運行。現在我不想深入瞭解這一點,但重要的是你知道這存在。

一個更好的辦法來解決你的問題是使用IsolatedStorage像這樣

 IsolatedStorageSettings.ApplicationSettings.Remove("UserName"); 
     IsolatedStorageSettings.ApplicationSettings.Add("UserName", UserName); 
     IsolatedStorageSettings.ApplicationSettings.Remove("Password"); 
     IsolatedStorageSettings.ApplicationSettings.Add("Password", UserPassword); 

這樣做,你可能數據實際上保存到的applicationSettings並重新使用它的應用程序啓動下一次。記住存儲在IsolatedStorage中的所有內容基本上都是明文的,只能從同一個域/站點訪問。

您必須使用其中一種可用的安全方案來保護您的WCF服務,否則,SL3傳輸到WCF服務的信息將以明文形式提供,任何人都可以輕鬆讀取,並且任何人都可以調用您的wcf服務完全繞過你的SL應用程序,所以記得妥善保護一切。

+5

獨立存儲未加密,因此請在保存數據之前保護它。 – 2009-08-21 15:03:23

+0

在將Silverlight保存到IsolatedStorage之前,Silverlight不提供RSA加密支持來保護用戶密碼。無論如何,我強烈建議不要將這種類型的信息(密碼或登錄信息)放入隔離存儲器中,因爲它可能很容易丟失。即使您存儲某種散列,請考慮將該值盜取並應用於某些其他獨立存儲 – 2010-12-09 19:48:57

0

Silverlight中的WCF驗證通過您無權訪問的SOAP標頭執行 - 您無法根據請求將驗證信息從Silverlight傳遞給WCF。假設您正在使用ASP.NET應用程序服務來執行用戶身份驗證(這是我知道的唯一可以在此工作的技術),您的基本策略可能是調用ValidateUser方法,該方法將執行登錄並指示Silverlight控件在SOAP頭中包含該用戶會話信息,然後調用WCF服務。您可以通過在後臺登錄用戶來定期刷新會話,也可以根據憑證等待WCF調用失敗,然後再次驗證用戶。我不知道是否有一些活着的方面調用WCF服務,可能需要重新認證不太緊迫。

您可以存儲用戶的登錄名和密碼在獨立存儲的另一個海報的建議,但要確保你加密數據首先,它是純文本格式存儲在一個不起眼的位置,也不安全。

0

只要瀏覽器打開,最終目標就是臨時存儲用戶的變量。無論如何,如果數據不是兆字節,我只是暫時將它們存儲在應用程序或類中的變量或資源中,這樣您就不必擔心它在本地機器上顯示。瀏覽器會話結束後,它將消失。

App.Current.Resource.Add("MySessionItem", item) 

對於WCF調用,儘量讓ASP.net做了authenication爲您ASP.net應用服務(即My.User.Identity),不基於這些通過您的WCF方法驗證將參數存儲在臨時變量和/或資源中。

+0

這假定您想要使用ASP.Net。這是一個愚蠢的假設。雖然主要客戶端可能是Silverlight,但也可能有其他類型的客戶端不是瀏覽器。尤其適用於自動化或數據導入/導出。 – Christopher 2010-01-21 14:53:35

1

如果您的瀏覽器啓用了Cookies,會自動爲您處理會話。只需將一個空的Global.asax文件添加到您的Web應用程序中,會話將在第一個瀏覽器請求時自動創建。

1

嗯..你可以使用數據庫來幫助你做到這一點..

這是事情...

  1. Silverlight應用程序發送身份驗證WCF登錄服務
  2. WCF登錄服務在你的數據庫會話中驗證和創建會話
  3. WCF登錄將在成功登錄時返回true,在非法登錄時返回false
  4. Silverlight應用商店全局登錄變量供後期使用
  5. 現在你在你的應用和服務器:)上的信息

下一個問題是:1。 如何刪除服務器會話? *只需創建註銷按鈕和調用服務於數據庫 刪除您的會話*和刪除您的全局變量爲你的應用程序(會話變量/登錄變量)

  1. 如何,如果用戶不點擊註銷按鈕?

    • 在服務器站點只是做一些週期性的活動會話檢查。如果它不再有效,請將其刪除。
  2. 基本上,你必須把你的會話ID通過互聯網打電話給您的所有服務,以確認您的身份驗證的用戶:)

注: 那麼,有沒有其他辦法,因爲服務是無狀態的。