2017-03-07 191 views
1

请参考下面的应用:异常= HTTP请求是未经授权的客户端身份验证方案 '匿名'

public Form1() 
     { 
      try 
      { 
       InitializeComponent(); 
       ServiceReference1.Service1Client s1 = new ServiceReference1.Service1Client(); 
       s1.ClientCredentials.UserName.UserName = "testuser"; 
       s1.ClientCredentials.UserName.Password = "testpass"; 
       string str = s1.GetData(1); 
      } 
      catch (System.ServiceModel.Security.MessageSecurityException e) 
      { 
       //Handle an authentication failure 
       using (System.IO.StreamWriter file = 
        new System.IO.StreamWriter(@"C:\LogFile\log.txt")) 
       { 
        file.WriteLine("User Authentication Failed"); 
       } 
      } 

     } 

和下方的app.config:

<system.serviceModel> 
     <bindings> 
      <wsHttpBinding> 
       <binding name="WSHttpBinding_IService1"> 
        <security mode="TransportWithMessageCredential"> 
         <message clientCredentialType="UserName" /> 
        </security> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="https://hq-wk-is/WCFSSL/Service1.svc" binding="wsHttpBinding" 
       bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1" 
       name="WSHttpBinding_IService1" /> 
     </client> 
    </system.serviceModel> 

这里是在web.config

<system.serviceModel> 
    <services> 
     <service name="WcfService1.Service1"> 
     <endpoint contract="WcfService1.IService1" binding="wsHttpBinding" bindingConfiguration="wsHttpBindingConfiguration"/> 
     </service> 
    </services> 

    <behaviors> 
     <serviceBehaviors>  

     <!--added--> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      <serviceCredentials> 
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WcfService1.CustomUserNameValidator, WcfService1" /> 
      </serviceCredentials> 
     </behavior> 

     <!--<behavior> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior>--> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </protocolMapping> 

    <!--added--> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="wsHttpBindingConfiguration" > 
      <security mode="TransportWithMessageCredential" > 
      <message clientCredentialType="UserName" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 

和的CustomValidator:

服务的
namespace WcfService1 
{ 
    public class CustomUserNameValidator : UserNamePasswordValidator 
    { 
     public override void Validate(string userName, string password) 
     { 

      using (System.IO.StreamWriter file = 
      new System.IO.StreamWriter(@"C:\log\log.txt")) 
      { 
       file.WriteLine("Hola"); 
      } 



      if (null == userName || null == password) 
      { 
       throw new ArgumentNullException(); 
      } 

      if (!(userName == "testuser" && password == "testpass")) 
      { 
       // This throws an informative fault to the client. 
       throw new FaultException("Unknown Username or Incorrect Password"); 
       // When you do not want to throw an infomative fault to the client, 
       // throw the following exception. 
       // throw new SecurityTokenException("Unknown Username or Incorrect Password"); 
      } 
     } 
    } 
} 

我已经在IIS中为此Web应用程序启用了基本身份验证。

我得到的错误是:The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Basic realm="MyPC"'

问题是什么?为什么证书是匿名发送的?我相信在这种情况下,证书应该在SOAP头中传递。

回答

相关问题