2011-04-11 48 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可能有意义。