2011-05-12 23 views
3

我有一個wcf服務,用戶在進行服務調用之前需要進行身份驗證。不會有用戶通過登錄驗證的網站,或者用戶驗證的Windows /控制檯應用程序。我想這樣做是這樣的:將xml請求中的用戶名和密碼傳遞給wcf服務進行身份驗證?

傳入一個請求:

<GetCars> 
    <Credentials username="test" password="test" /> 
</GetCars> 

如果用戶名和密碼是成功的,返回GetCars否則無法成功響應。

問題是我不知道如何將請求傳遞給上述的wcf服務,然後讀取用戶名和密碼屬性來驗證它。

+0

您可能還想研究內置對WCF SOAP請求進行身份驗證處理的WS-Security。 – mellamokb 2011-05-12 19:51:08

+0

我正在使用wsHttpBinding。我不清楚發送XML請求時代碼的放置位置。 – Xaisoft 2011-05-12 19:51:48

回答

6

我將很快嘗試描述我在我自己的WCF服務中使用的身份驗證方法。使用WS-Security規範(即,您正在使用wsHttpBinding)的WCF SOAP端點具有內置的身份驗證處理。您可以實現在web.config中使用的設置是這樣的:

<bindings> 
    <wsHttpBinding> 
    <binding name="myBindingName"> 
     <security mode="Message"> 
     <transport clientCredentialType="None" /> 
     <message clientCredentialType="UserName" /> 
     </security> 

然後,你可以指定一個自定義類型來處理身份驗證邏輯:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="myBehaviorName"> 
     <serviceCredentials> 
     <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="NameSpaceName.Class,AssemblyName" /> 
     </serviceCredentials> 

這個類來處理身份驗證邏輯應該延伸UserNamePasswordValidator(需要引用System.IdentityModel.dll並導入System.IdentityModel.Selectors此),並覆蓋Validate

public class MyValidator : UserNamePasswordValidator { 
    public override void Validate(string userName, string password) { 
     // check password. if success, do nothing 
     // if fail, throw a FaultException 
    } 
} 

調用使用一個ASP.Net WCF客戶端需要使用ClientCredential通過用戶名和密碼,這樣的代碼:

// This pattern needs to be repeated and username/password set with every creation 
// of a client object. This can be refactored to a separate method to simplify. 
MyAPIClient client = new MyAPIClient(); 

// yes UserName is there twice on purpose, that's the proper structure 
client.ClientCredentials.UserName.UserName = theUsername; 
client.ClientCredentials.UserName.Password = thePassword; 

try { 
    client.Open(); 
    client.DoSomething(); 
    client.Close(); 
} catch (Exception ex) { 
    // handle exception, which should contain a FaultException; 
    // could be failed login, or problem in DoSomething 
} 

顯然,結合和上述定義的行爲已經被分配到使用behaviorConfiguration服務本身和bindingConfiguration屬性。

+0

我已經擁有了您在web.config中提到的所有內容,並且我有一個自定義驗證器,那麼您是否在說我的驗證應該讀取用戶名並來自xml文件的密碼並將其設置爲ClientCredentials的用戶名和密碼 – Xaisoft 2011-05-12 20:02:09

+0

此認證結構正在取代您從XML請求中解析它的想法。 「驗證」應該包含您在語句背後的邏輯「如果用戶名和密碼成功,返回GetCars的成功響應否則失敗。」什麼是確定用戶名和密碼是否成功?這就是'驗證'應該做的。 – mellamokb 2011-05-12 20:04:25

+0

在我的情況下,用戶名和密碼將來自xml請求。我想我可以使用Linq到Xml讀取用戶名和密碼屬性? – Xaisoft 2011-05-12 20:16:50

相關問題