2013-03-15 131 views
2

我想學習WCF,但我真的不明白我必須做什麼。我有一個使用用戶名和密碼的數據庫,用戶在使用服務之前應該進行身份驗證。基本身份驗證和WCF

現在,用戶名和密碼是硬編碼:

class UsernameAuthentication : UserNamePasswordValidator 
{ 
    /// <summary> 
    /// When overridden in a derived class, validates the specified username and password. 
    /// </summary> 
    /// <param name="userName">The username to validate.</param><param name="password">The password to validate.</param> 
    public override void Validate(string userName, string password) 
    { 
     var ok = (userName == "test") && (password == "test"); 
     if (ok == false) 
      throw new AuthenticationException("username and password does not match"); 
    } 
} 

我的服務很簡單:

public class Service1 : IService1 
{ 
    public int Add(int a, int b) 
    { 
     return a + b; 
    } 

    public int Subtract(int a, int b) 
    { 
     return a - b; 
    } 
} 

我的問題是:究竟是什麼我在web.config中改變文件使這項工作?我看了一些教程,但並不真正瞭解所需的更改。

此外,我正在嘗試 - 在用戶訪問服務之前驗證用戶,這是正確的做法它?

感謝

編輯: 我的配置文件:

<?xml version="1.0"?> 
<configuration> 
    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    </appSettings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5"/> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="Binding1"> 
      <security mode="Message"> 
      <message clientCredentialType="UserName" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceCredentials> 
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WcfService1.UsernameAuthentication, service1" /> 
      </serviceCredentials> 
      <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </protocolMapping>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <!-- 
     To browse web app root directory during debugging, set the value below to true. 
     Set to false before deployment to avoid disclosing web app folder information. 
     --> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 
</configuration> 

錯誤:service1.svc不能被激活。

回答

4

您必須在web.config中指定您將使用用戶名/密碼憑證並且使用自定義密碼驗證程序。

您的服務綁定應該設置了一種安全性(TransportMessage,最適合您),對於此類安全性,您必須設置要使用的憑據(用戶名和密碼)。

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="Binding1" ...> 
     <security mode="Message"> 
      <message clientCredentialType="UserName" /> 
     </security> 
     </binding>   
    </wsHttpBinding> 
    </bindings> 
</system.serviceModel> 

其中...表示許多其他設置特定於您的服務。

考慮到只有某些類型的綁定和安全模式支持這種類型的憑據,但MSDN具有您可能需要的所有信息。

如果您沒有將憑據設置爲用戶名和密碼,那麼您將不會以這種方式對用戶進行身份驗證。

告訴該服務使用密碼驗證您需要添加這樣的事情:

<behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceCredentials> 
       <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.CalculatorService.CustomUserNameValidator, service" /> 
      </serviceCredentials> 
     ..... 
     </serviceBehaviors> 
</behaviors> 

Microsoft.ServiceModel.Samples.CalculatorService是在其下具有自定義驗證命名空間,CustomUserNameValidator是在格蘭自定義驗證(UserNamePasswordValidator你的情況),並且service是服務的名稱。

否則,該服務會期望默認驗證程序,如ASP.NET成員資格提供程序。

服務憑證必須放在您的服務行爲中。

此外,不要忘記將行爲鏈接到服務定義。

<services> 
    <service behaviorConfiguration="ServiceBehavior" name="ServiceName"> 
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="Binding1" contract="ContractName" /> 
    .... 
    </service> 
</services> 

注意:有在我沒有表現出在web.config更多的設置。元素的名稱只是定向的。這僅僅是爲了使用戶名憑證起作用。

您可以查看MSDN,因爲他們對此有很多偉大的教程,像這樣的http://msdn.microsoft.com/en-us/library/aa702565.aspxhttp://msdn.microsoft.com/en-us/library/aa354513.aspx

是的,事實上,如果您以正確的方式配置它,它將在授予它們運行服務方法的權限之前對客戶端(用戶,客戶端服務)進行身份驗證。

+0

在哪裏我必須把? – Bv202 2013-03-15 12:25:32

+0

在''下,您的服務行爲。 – 2013-03-15 12:41:29

+0

嘿,我已經添加了我的配置文件。你能看看嗎?謝謝 – Bv202 2013-03-15 12:44:54