2011-04-11 86 views
1

我試圖UserNamePasswordValidator添加到「WCF REST服務應用」項目與Visual Studio 2010, 問題..它從來沒有踏入UserNamePasswordValidator類, 是WCF休息UserNamePasswordValidator工作?WCF休息與UserNamePasswordValidator問題

請告知..

下面

是我的服務類:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
using System.ServiceModel.Web; 
using System.Text; 
using System.Security.Principal; 


namespace MyService 
{ 
    // Start the service and browse to http://<machine_name>:<port>/Service1/help to view the service's generated help page 
    // NOTE: By default, a new instance of the service is created for each call; change the InstanceContextMode to Single if you want 
    // a single instance of the service to process all calls. 
    [ServiceContract(Namespace = "MyService")] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
    // NOTE: If the service is renamed, remember to update the global.asax.cs file 
    public class Helo 
    { 
     [WebGet(UriTemplate = "{name}")] 
     public string GetName(string name) 
     { 
      // TODO: Replace the current implementation to return a collection of SampleItem instances 
      return "Hello " + name; 
     } 

     public class CustomUserNameValidator : System.IdentityModel.Selectors.UserNamePasswordValidator 
     { 
      // This method validates users. It allows in two users, test1 and test2 
      // with passwords 1tset and 2tset respectively. 
      // This code is for illustration purposes only and 
      // MUST NOT be used in a production environment because it is NOT secure. 
      public override void Validate(string userName, string password) 
      { 
       if (null == userName || null == password) 
       { 
        throw new ArgumentNullException(); 
       } 

       if (!(userName == "test1" && password == "1tset") && !(userName == "test2" && password == "2tset")) 
       { 
        throw new FaultException("Unknown Username or Incorrect Password"); 
       } 

       throw new FaultException("Unknown Username or Incorrect Password"); 
      } 
     } 
    } 
} 
下面

是在web.config:

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 

    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
    </modules> 
    </system.webServer> 

    <system.serviceModel> 

    <services> 
     <service name="MyService.Hello" behaviorConfiguration="HelloServiceBehavior"> 
     <!-- use base address provided by host, provide one endpoint --> 
     <endpoint address="username" binding="wsHttpBinding" bindingConfiguration="Binding1" contract="MyService.Hello"/> 
     </service> 
    </services> 

    <bindings> 
     <wsHttpBinding> 
     <!-- Username binding --> 
     <binding name="Binding1"> 
      <security mode="Message"> 
      <message clientCredentialType="UserName"/> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="HelloServiceBehavior"> 
      <serviceCredentials> 
      <!-- 
      The serviceCredentials behavior allows one to specify a custom validator for username/password combinations.     
      --> 
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyService.Hello+CustomUserNameValidator, MyService"/> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 


    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <!--<standardEndpoints> 
     <webHttpEndpoint> 
     --><!-- 
      Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
      via the attributes on the <standardEndpoint> element below 
     --><!-- 
     <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/> 
     </webHttpEndpoint> 
    </standardEndpoints>--> 
    </system.serviceModel> 

</configuration> 

回答

0

我不知道,如果你還在尋找一個答案,但如果你是...

在WCF上設置身份驗證REST不僅僅是點亮非常棘手。似乎你是從msdn,amirite直接模擬你的嘗試?我也沒有太多運氣。您可以嘗試在this解決方案之後建模,這是基本身份驗證的一個非常基本的示例。但是我的建議,因爲它對我來說效果很好,所以在WcfRestContrib之後爲你的項目建模。不僅基礎認證已經內置到項目中,而且您最終還會發現您想要的許多其他功能。您可以對整個服務執行身份驗證,或者僅對端點執行端點身份驗證。

希望有所幫助。

1

你必須有一個webHttpBinding並將clientCredentialType設置爲基本的,這將使用派生的UserNamePasswordValidator。如果您有HTTPS設置那麼當然改變安全模式,以交通:

 <bindings> 
     <webHttpBinding> 
      <binding name="RestBindingConfiguration"> 
       <security mode="None"> 
        <transport clientCredentialType="Basic"/> 
       </security> 
      </binding> 
     </webHttpBinding> 
     </bindings> 

與此相關的旁註,FaultExceptions是SOAP只有這麼瞭解,若您需要拋出一個異常的客戶端。根據例外情況,MessageSecurityException可能有意義。