2009-12-19 36 views
12

Servidor:La solicitud HTTP no está autorizada con el esquema de autenticación de cliente 'Básico'. El encabezado de autenticación recibido del servidor fue 'dominio básico = "PC"'

<system.serviceModel> 
    <services> 
     <service name="Service" behaviorConfiguration="md"> 
      <!-- Service Endpoints --> 
      <endpoint address="SslService" binding="basicHttpBinding" bindingConfiguration="security" contract="IService"/> 
      <host> 
       <baseAddresses> 
        <add baseAddress="https://pc:8080/Service.svc"/> 
       </baseAddresses> 
      </host> 
     </service> 
    </services> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="security"> 
       <security mode="Transport"> 
        <transport clientCredentialType="Basic"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="md"> 
     <serviceCredentials> 
     <userNameAuthentication 
      userNamePasswordValidationMode="Custom" 
      customUserNamePasswordValidatorType="ClassLibrary1.CustomUserNameValidator, ClassLibrary1" /> 
     </serviceCredentials> 
       <serviceMetadata httpsGetEnabled="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

ClassLibrary1.CustomUserNameValidato:

public class CustomUserNameValidator : System.IdentityModel.Selectors.UserNamePasswordValidator 
    { 
     public override void Validate(string userName, string password) 
     { 
      if (userName != "111" || password != "111") 
      { 

       throw new System.ServiceModel.FaultException("Unknown username or incorrect password"); 
      } 
     } 
    } 

Cliente:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_IService" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
       messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
       useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <security mode="Transport"> 
        <transport clientCredentialType="Basic" proxyCredentialType="Basic" realm=""> 
         <extendedProtectionPolicy policyEnforcement="Never" /> 
        </transport> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="https://pc:8080/Service.svc/SslService" binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService" 
      name="BasicHttpBinding_IService" /> 
    </client> 
</system.serviceModel> 

ServiceReference1.ServiceClient s = new WindowsFormsApplication1.ServiceReference1.ServiceClient(); 

s.ClientCredentials.UserName.UserName = "111"; 
s.ClientCredentials.UserName.UserName = "111"; 
MessageBox.Show(s.GetData(3)); // <---- ERROR 

La solicitud HTTP no está autorizada con el esquema de autenticación de cliente 'Básico'. El encabezado de autenticación recibido del servidor fue 'Basic realm = "pc"'.

Respuesta

1

Parece que ha configurado el nombre de usuario dos veces en lugar del nombre de usuario y la contraseña.

Cuando tienes la autenticación básica y no envías el nombre de usuario y la contraseña con la solicitud, obtienes una respuesta de desafío.

3

intenta enviar nombre de usuario y la contraseña no en http con la autenticación básica (esto puede desconcertar IIS), pero sólo en las cabeceras de jabón de mensajes con esquema siguiente:

<binding name="..."> 
     <security mode="TransportWithMessageCredential" > 
      <message clientCredentialType="UserName" /> 
     </security> 
</binding> 

How to: Use Transport Security and Message Credentials

Tal vez también necesita para especificar adicionalmente <transport clientCredentialType="None">

8

Supongo que está alojando su servidor de servicio en el IIS. Entonces el problema es que el IIS intercepta la solicitud https y realiza la autenticación de nivel IIS antes del marco WCF y su validador personalizado tiene la oportunidad de activarse.

En su ejemplo, el IIS realmente buscará un usuario local ' 111 'con la contraseña' 111 'en el servidor que ejecuta el IIS. Intenta crear este usuario en el servidor, y probablemente obtengas un resultado diferente.

Una solución es alojar su servidor de servicio WCF en otro lugar, por ejemplo, en un servicio de Windows. Otra solución es cambiar su esquema de seguridad a TransportWithMessageCredential. Finalmente, puede consultar este módulo HTTP de OSS: Custom Basic Authentication for IIS - parece hacer el truco que necesitamos.

8

que había creado un cliente de la siguiente manera:

using (var client = new Client()) 
    { 

    client.ClientCredentials.UserName.UserName = <username>; 
    client.ClientCredentials.UserName.Password = **<WRONG_PASSWORD>**; 
... 
    } 

La sección de seguridad de mi unión veía así:

  <security mode="Transport"> 
      <transport clientCredentialType="Basic" proxyCredentialType="Basic" realm="" /> 
      </security> 

Y vi volver este error. Una vez que corregí la contraseña, todo funcionó.

+0

de acuerdo con esto. una contraseña incorrecta podría ser una razón para este mensaje de error. – VoodooChild

+1

Gracias. La parte de configuración web de su respuesta resolvió mi problema.) –

Cuestiones relacionadas