2011-11-22 75 views
18

Problemas para utilizar la autenticación básica con un servicio Wcf de prueba simple. Obtengo una excepción:Wcf Autenticación básica

El servicio solicitado, 'http: //qld-tgower/test/Service.svc' no se pudo activar. Consulte los registros de seguimiento de diagnóstico del servidor para obtener más información.

Y en el Registro de seguimiento se muestra:

Los esquemas de autenticación configurados en el host ('Básico') no permiten que los configurados en el 'BasicHttpBinding' vinculante ('Anónimo'). Asegúrese de que SecurityMode esté configurado en Transport o TransportCredentialOnly. Además, esto puede resolverse cambiando los esquemas de autenticación para esta aplicación a través de la herramienta de administración IIS, a través de la propiedad ServiceHost.Authentication.AuthenticationSchemes, en el archivo de configuración de la aplicación en el elemento <serviceAuthenticationManager>, actualizando la propiedad ClientCredentialType en el enlace. o ajustando la propiedad AuthenticationScheme en HttpTransportBindingElement.

Pero lo que yo no entiendo cuando nosotros el nombre de usuario y la contraseña incorrecta que dice que ES mediante la autenticación básica?

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

Esto es más detalles web.config

<system.serviceModel> 
<services> 
    <service name="WcfService" 
     behaviorConfiguration="Behavior"> 
    <endpoint address="http://QLD-TGOWER/test/Service.svc" 
       binding="basicHttpBinding" 
       bindingConfiguration="httpBinding" 
       contract="IService" /> 
    </service> 
</services> 
<diagnostics> 
    <endToEndTracing activityTracing="false" messageFlowTracing="true" propagateActivity="true"></endToEndTracing> 
</diagnostics> 
<bindings> 
    <basicHttpBinding> 
    <binding name="httpBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Basic" proxyCredentialType="Basic"> 
     </transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpGetEnabled="true"/> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
</system.serviceModel> 

y este es mi App.config

<system.serviceModel> 
    <diagnostics> 
     <endToEndTracing activityTracing="true" /> 
     <messageLogging logMessagesAtTransportLevel="true" /> 
    </diagnostics> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IService" > 
      <security mode="TransportCredentialOnly"> 

      <transport clientCredentialType="Basic" proxyCredentialType="Basic"></transport> 
      <message clientCredentialType="UserName" /> 
      </security> 

     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://QLD-TGOWER/test/Service.svc" binding="basicHttpBinding" 
     bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService" 
     name="BasicHttpBinding_IService" /> 
    </client> 
</system.serviceModel> 

mi aplicación de prueba

private static void Main(string[] args) 
{ 
    var proxy = new ServiceClient("BasicHttpBinding_IService"); 
    var clientCredentials = proxy.ClientCredentials; 
    clientCredentials.UserName.UserName = "username"; 
    clientCredentials.UserName.Password = "password"; 
    var res = proxy.GetData(1); 
    Console.WriteLine(res); 
    Console.WriteLine("Done"); 
    Console.ReadKey(true); 
} 

Y mi servicio

public class Service : IService 
{ 

    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

¿Hay algo que me falta aquí?

Respuesta

17

Cambie el nombre y el contrato del servicio para incluir el espacio de nombres.

Además, elimine la dirección del punto final (establézcala en "") y no incluya proxyCredentialType en la etiqueta de transporte.

Resultado final del web.config debe ser algo como esto

<system.serviceModel> 

    <services> 
     <service name="MyNameSpace.MyService" behaviorConfiguration="asdf"> 
     <endpoint address="" binding="basicHttpBinding" 
      bindingConfiguration="httpBinding" contract="MyNameSpace.IMyService" /> 
     </service> 
    </services> 

    <diagnostics> 
     <endToEndTracing activityTracing="true" messageFlowTracing="true" 
      propagateActivity="true"> 
     </endToEndTracing> 
    </diagnostics> 

    <bindings> 
     <basicHttpBinding> 
     <binding name="httpBinding"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="asdf"> 
      <!-- To avoid disclosing metadata information, set the value below to 
       false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true" /> 
      <!-- To receive exception details in faults for debugging purposes, 
       set the value below to true. Set to false before deployment to avoid 
       disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 

     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <serviceHostingEnvironment multipleSiteBindingsEnabled="false"/> 

    </system.serviceModel> 
2

Try para ambas configuraciones de cliente y servidor

<basicHttpBinding> 
    <binding name="BasicHttpBinding_IService"> 
     <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic" /> 
     </security> 
    </binding> 
</basicHttpBinding> 

Instalar/Habilitar la autenticación básica

También puede ser necesario para instalar y aplicar la autenticación básica en IIS.

Ir a "Programas y características"/"Activar/desactivar las características de Windows". Habilite la "autenticación básica" en algún lugar bajo IIS y seguridad.

Cerré y abrí la consola de IIS y pude habilitarla en la configuración de autenticación.

Esto, por supuesto, si para una prueba de desarrollo y le advierte sobre no tener un certificado SSL.

+0

Gracias, Eso ha solucionado los errores de autenticación, pero ahora el servicio simplemente entra en estado de falla. No hay nada en los registros de seguimiento para indicar por qué. – TheRealTy

1

Usted no está autorizado a utilizar la autenticación de nombre de usuario a través de una conexión no segura

Puede proteger el mensaje mediante el uso de un transporte seguro (por ejemplo, SSL) o el cifrado de mensajes (mediante certificados)

he utilizado ClearUsernameBinding en el pasado con gran éxito, pero no lo recomiendo en producción. Lo utilicé para poder mantener todos mis códigos de autenticación de la misma manera sin requerir SSL en entornos de desarrollo/prueba, pero haciendo que funcione con SSL cambiando solo la configuración.

Nota: el enlace personalizado no es perfecto, y tuve que cambiarlo un poco para permitir ciertos cambios de configuración.

0

Esto es lo que resolvió el problema para mí:

<bindings> 
    <basicHttpBinding> 
    <binding> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Para referencia, véase: https://msdn.microsoft.com/en-gb/library/ff648505.aspx