简体   繁体   中英

WCF Authentication using basicHttpBinding and custom UserNamePasswordValidator?

Here i am implementing custom usernamepasswordvalidator in WCF RESTfull service.What i need is while invoking this one http://localhost:12229/RestServiceImpl.svc/GetStudentObj through Chrome REST Client it is not validating the username password..it directly invoke this method and fetching the result.What am i doing wrong here??

My interface

 [ServiceContract]
    public interface IRestServiceImpl
    {
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "/GetStudentObj", RequestFormat = WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json)]
        Student GetStudent();
    }

SVC

public class RestServiceImpl : IRestServiceImpl
    {
        public Student GetStudent()
        {
                Student stdObj = new Student
                {
                    StudentName = "Foo",
                    Age = 29,
                    Mark = 95
                };
                return stdObj;

        }

        public class CustomUserNameValidator : UserNamePasswordValidator
        {
           public override void Validate(string userName, string password)
            {

                if (null == userName || null == password)
                {
                    throw new ArgumentNullException("You must provide both the username and password to access this service");
                }

                if (!(userName == "user1" && password == "test") && !(userName == "user2" && password == "test"))
                {

                     throw new SecurityTokenException("Unknown Username or Incorrect Password");
                }
            }
        }

    }

and Web.Config

 <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpTransportSecurity">
          <security mode="Transport">
            <transport clientCredentialType="Basic"></transport>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <protocolMapping>
      <add scheme="http" binding="webHttpBinding"/>
    </protocolMapping>
    <services>
      <service name="RestService.RestServiceImpl" >
        <endpoint address="" binding="webHttpBinding" contract="RestService.IRestServiceImpl"></endpoint>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp />
        </behavior >
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="SecureRESTSvcTestBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="RESTfulSecuritySH.CustomUserNameValidator, RESTfulSecuritySH" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Any suggestion??

It seems that you didn't set the custom behavior for your service.

You need to tell the service about your SecureRESTSvcTestBehavior behavior by using the behaviorConfiguration attribute:

<service name="RestService.RestServiceImpl" behaviorConfiguration="SecureRESTSvcTestBehavior">
    <endpoint address="" binding="webHttpBinding" contract="RestService.IRestServiceImpl"></endpoint>
</service>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM