我有以下情形。針對長時間運行的應用程序的WCF驗證會話
有一個WCF .NET 4服務,託管在IIS 7
該服務將兩個類型的客戶端進行訪問:
- Silverlight客戶端(將在後面創建)
- 三個C#.NET 4控制檯應用程序(已創建和測試)
要訪問此WCF服務,我創建了一個簡單的包裝DLL(我不使用Visual Studio自動生成引用以避免在我的WCF更改時在多個項目中更新它們,但我使用自動生成的引用作爲包裝的模板)。
這是我的包裝看起來像:
class MyServiceClient : System.ServiceModel.ClientBase<IMyService>,
IMyService
它基本上轉發所有的呼叫base.Channel。
現在我們開始考慮實現身份驗證。我們的IIS和控制檯應用程序不保證位於同一個域中,因此Windows驗證不是一個選項。很顯然,我們必須在用於控制檯應用程序的應用程序配置文件中存儲用戶名/密碼,並且WCF將根據我們的用戶數據庫對其進行檢查。
每消息認證似乎有點太流量和資源沉重 - 那麼我們將不得不在每次調用時選擇用戶形式我們的數據庫。我們的控制檯應用程序是計劃任務,他們可能整天運行併發出數千個WCF請求。所以我們需要某種認證的用戶會話。
另外我很擔心如果我的System.ServiceModel.ClientBase意外斷開會發生什麼。目前(沒有任何身份驗證),ClientBase能夠無提示地重新連接,沒有任何問題。我想在添加auth實現後保持相同的行爲。客戶端應該能夠靜默地重新登錄,而不會向調用應用程序拋出任何異常。
據我所知,爲了在WCF中允許所有ASP.NET會話的好處,我必須在ASP.Net兼容模式下運行,並確保每個用戶都有自己的線程和自己的Thread.CurrentPrincipal。但我不知道如何確保如果連接中斷/服務器重新啓動,登錄將自動重新引導。我是否需要爲每個方法調用添加tr..catch,並在出現SecurityException時重新登錄?似乎有點骯髒的解決方案。
現在我可以總結一下兩個問題:
我有IIS WCF服務和控制檯應用程序之間的身份驗證自動恢復原狀會議有哪些選擇?
如何以某種方式實現身份驗證會話,以便我的WCF服務客戶端包裝能夠在斷開連接的情況下恢復/創建新會話?
如果Silverlight不支持的WSHttpBinding和WCF不允許用戶憑據傳遞了basicHttpBinding的(由於安全原因),那我怎麼才能實現我的身份驗證安全的方式? 我找到以下文章: http://www.dotnetcurry.com/ShowArticle.aspx?ID=589 它解釋瞭如何使Silverlight通過自定義綁定來使用SSL,但我不知道如何將我的auth會話放在它中,所以它也可用於控制檯應用程序。