2012-10-07 111 views
0

對於客戶端服務器應用程序,我想開發一個主要由應用程序本身使用的Web服務(目前不打算供第三方使用)。通過服務方法自定義身份驗證?

然而,從長遠來看,將WebService公開爲某種API通常是可取的。因此,我已經在選擇一種能夠在稍後輕鬆地進行「RESTIFing」(可怕的單詞創作,我知道;-))Web服務的技術方面提出一些想法。
WCF似乎就在這裏,因爲它提供了webHttpBinding,還有其他允許利用局域網和.NET客戶端的綁定。

我現在遇到的問題是關於驗證:WCF提供的所有驗證措施似乎都發生在「實際服務之外」。但是,我想有一個Login方法(或者更多的「RESTful」,如here under point 2所示)。

例如,我想編寫一個服務像這樣的:

[ServiceContract] 
public interface IUserService 
{ 
    [ServiceMember] 
    [WebInvoke(Method = "POST", WebUri="/Session")] 
    public void Login(string username, string password); 

    [ServiceMember] 
    [WebInvoke(Method = "POST", WebUri="/Users")] 
    public void Register(RegisterUserParameter parameter); 
} 

我怎麼這個服務集成到WCF所以最好的方法,我的服務項目的工作在多個子服務?

使用內置的WCF認證時,我需要在進行任何服務調用之前提供用戶名和密碼。因此,撥打RegisterLogin將會失敗,因爲我沒有得到確認。

如何告訴WCF使用我的服務方法記住哪個用戶當前登錄?有沒有可能在客戶端的WCF會話中存儲類似會話cookie的東西?

或者在WCF下以我想要的方式實現身份驗證通常不是個好主意嗎?

我是否應該直接選擇WebAPI,其代價是在客戶端應用程序中使用更復雜的方式與服務對話?

回答

0

如果您依賴外部身份驗證(如FormsAuthentication),我認爲您可以輕鬆實現您的目標。

的想法是防範與的PrincipalPermission屬性只INE例外所有的方法 - 這是剛剛應該追加的形式cookie來響應該登錄方法。

一些技術細節可以在這裏找到我的博客文章之一:

http://netpl.blogspot.com/2010/04/aspnet-forms-authentication-sharing-for.html

雖然我提到的Silverlight作爲一個客戶那裏,該解決方案是通用的,適用於任何客戶端技術。此外,博客文章中未提及登錄方法,但其唯一目的是將Forms cookie附加到響應。

這樣,您的客戶的控制流程將首先calk您的登錄方法,然後,與問題的cookie,調用所有其他方法。

請注意,這隻適用於Http綁定,因此這不是任何可能的Wcf綁定的通用解決方案。

0

你可以嘗試以下方法:

  1. 與WCF的登錄口令驗證創建登錄服務。它將使用例如UserNamePasswordValidator的子類,以針對DB驗證用戶名密碼等。如果驗證成功,則返回一個標記(例如GUID)。

  2. 所有其他服務調用將由客戶端與此令牌一起進行。令牌驗證可以集中進行,無需修改每項服務。要做到這一點:

    • 通過你的令牌您請求的頭
    • 實施IDispatchMessageInspector在其AfterReceiveRequest讀取頭令牌和驗證。如果驗證成功,工作流程會去你的WCF服務中,如果不是你丟的FaultException
    • 附上MessageInspector給需要驗證服務:


      ...

相關問題