clientcredentialtype - Wcf autenticación básica
wcf binding security mode (4)
Cambie el nombre y el contrato del servicio para incluir el espacio de nombres.
Además, elimine la dirección del punto final (configúrela a "") y no incluya proxyCredentialType en la etiqueta de transporte.
El resultado final de la web.config debería verse 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>
Tener algunos problemas para usar la autenticación básica con un simple servicio Wcf de prueba. Estoy recibiendo una excepción:
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 aquellos configurados en el enlace ''BasicHttpBinding'' (''Anónimo''). Asegúrese de que SecurityMode esté configurado en Transport o TransportCredentialOnly. Además, esto se puede resolver cambiando los esquemas de autenticación para esta aplicación a través de la herramienta de administración de IIS, a través de la propiedad ServiceHost.Authentication.AuthenticationSchemes, en el archivo de configuración de la aplicación en el <serviceAuthenticationManager>, actualizando la propiedad ClientCredentialType en el enlace. o ajustando la propiedad AuthenticationScheme en HttpTransportBindingElement.
Pero, ¿qué es lo que no entiendo cuando uso el nombre de usuario y la contraseña incorrectos y dice que ESTÁ utilizando una autenticación básica?
La solicitud HTTP no está autorizada con el esquema de autenticación del cliente ''Básico''. El encabezado de autenticación recibido del servidor fue ''Basic realm = "qld-tgower"''.
Esta es mi web.config detalles
<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 esta 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 estoy perdiendo aquí?
Esto es lo que me solucionó el problema:
<bindings>
<basicHttpBinding>
<binding>
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
Para referencia, consulte: https://msdn.microsoft.com/en-gb/library/ff648505.aspx
No se le permite usar la autenticación de nombre de usuario en una conexión no segura
Puede proteger el mensaje utilizando un transporte seguro (p. Ej. SSL) o cifrado de mensajes (utilizando certificados)
He utilizado ClearUsernameBinding en el pasado con gran éxito, pero no lo recomiendo en producción. Lo usé para poder mantener el mismo código de autenticación sin requerir SSL en los entornos de desarrollo / prueba, pero para que funcione con SSL cambiando solo la configuración.
Nota: el enlace personalizado no es perfecto, y tuve que cambiarlo un poco para habilitar ciertos cambios de configuración.
Pruébelo para configuraciones de cliente y servidor
<basicHttpBinding>
<binding name="BasicHttpBinding_IService">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
Instalar / Habilitar autenticación básica
Es posible que también deba instalar y aplicar la autenticación básica en IIS.
Vaya a "Programas y características" / "Activar / desactivar las características de Windows". Habilitar la "autenticación básica" en algún lugar bajo IIS y seguridad.
Cerré y abrí la consola IIS y pude habilitarla en la configuración de autenticación.
Esto, por supuesto, si para una prueba de desarrollo y le advierte acerca de no tener un certificado SSL.