2008-12-18 70 views
6

我正在開發一個項目,我需要以下內容。在服務器側(.NET 3.5) 沒有證書的WCF用戶名

  • WPF客戶端對客戶端(.NET 3.0)

    • WCF服務

    我有一個現有的應用程序,我使用的身份驗證和授權來自(在服務器端)。我還需要在WCF服務的Thread Principal(一個站點對象)中存儲一些關於用戶的元數據。我這樣做是爲了讓我可以在WCF服務中得到它,如果我絕對必須的;一些業務邏輯可能需要它。所以我的計劃是要做到以下幾點...

    爲服務器創建一個自定義的ServiceAuthorizationManager,然後在那裏我將登錄用戶並從現有應用程序獲取角色。我將緩存「Site」對象,並在進一步請求從緩存中拉出時。我還需要一個CustomPrincipal對象來保存我的自定義數據。我想冒充用戶,這樣我可以使用WCF這樣的過濾內置的角色:

    [PrincipalPermission(SecurityAction.Demand, Role = "Role1")] 
    public string[] RolesForUser(string username){} 
    

    我試圖使用ASP.NET授權使用自定義角色的供應商,但我不能設置現任校長的任何事情。我也嘗試使用自定義IAuthorizationPolicy,但出現問題。這些問題涉及能夠使用WCFClient.exe應用程序,當它發現(使用mex endpoing)它不會提供任何憑據,因此登錄將失敗。我最終決定ServiceAuthorizationManager是正確的路,但我願意接受其他建議。

    在客戶端,我將收集憑據並將它們放入WCF代理類中,如下所示。

    proxy.ChannelFactory.Credentials.UserName.UserName = userName; 
    proxy.ChannelFactory.Credentials.UserName.Password = password; 
    

    當我開始走這條路,我發現我不能在我的經理類的CheckAccessCore方法來獲取用戶名/密碼。進一步的調查顯示,我應該真的在自定義的UserNamePasswordValidator中進行身份驗證。所以我創建了其中一個。問題是驗證方法從未被調用過。

    進一步調查表明,爲了驗證方法被調用,我的WCF服務必須具有消息或傳輸級別的安全性。問題在於,我無法弄清楚如何在沒有X.509證書的情況下獲得消息或傳輸級別的安全性。該產品將進入數百個令人難以置信的鎖定機器,並且不可能安裝證書。

    有沒有辦法做我沒有安裝證書要求?

  • 回答

    6

    簡答題;你不能。只要您使用用戶名/密碼,您需要某種安全通道。

    但是,您不需要客戶端上的證書;只在服務器上。

    22

    其實這是可能的,但你需要實現自己的綁定。

    Yaron Naveh開發了一個WCF綁定,通過HTTP啓用明文的用戶名/密碼。他的article包括綁定的代碼。

    1

    我不知道您的網絡基礎結構的詳細信息,但如果您處於Windows域中,則應考慮使用Windows憑據。

    如果使用Windows憑據,則可以在沒有證書的情況下使用消息安全性。這是wsHttpBinding(開箱即用)的默認行爲。

    使用開箱即用的解決方案(無需實現自己的綁定)WCF鼓勵(需要)您在消息中包含身份驗證憑證時使用安全通道。

    使用允許您以明文形式指定憑據的自定義綁定無疑是一種解決方案,但在使用它之前我會考慮三次。

    相關問題