2009-06-25 574 views
53

He creado un servicio WCF y lo he implementado en el servidor. Cuando navego en este servicio, me da una respuesta positiva con? Wsdl URL. Ahora estoy tratando de probar el servicio a través del cliente de Prueba WCF. Muestra los metadatos apropiados. Pero cuando intento de invocar cualquiera de los métodos del servicio que me muestra una excepción ... aquí están los detalles erro con seguimiento de la pila ..WCFTestClient La solicitud HTTP no está autorizada con el esquema de autenticación del cliente 'Anónimo'

La petición HTTP no está autorizado con el esquema de autenticación del cliente 'Anónimo '. El encabezado de autenticación recibido del servidor fue 'Negociar, NTLM'.

seguimiento de la pila de servidor:

en
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (HttpWebRequest solicitud, HttpWebResponse respuesta, WebException responseException, HttpChannelFactory fábrica)
La solicitud HTTP es no autorizado con el cliente esquema de autenticación 'Anónimo'. El encabezado de autenticación recibido de el servidor era 'Negociar, NTLM'.

seguimiento de la pila de servidor:

en
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (HttpWebRequest solicitud, HttpWebResponse respuesta, WebException responseException, HttpChannelFactory fábrica)

Enlaces de cliente:

<bindings> 
    <wsHttpBinding> 
     <binding name="WSHttpBinding_IServiceMagicService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
      allowCookies="false"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
       enabled="false" /> 
      <security mode="None"> 
       <transport clientCredentialType="Windows" proxyCredentialType="None" 
        realm="" /> 
       <message clientCredentialType="Windows" negotiateServiceCredential="true" 
        establishSecurityContext="true" /> 
      </security> 
     </binding> 
    </wsHttpBinding> 
</bindings> 

enlaces del servidor:

<bindings> 
    <wsHttpBinding> 
    <binding name="WSHttpBinding_SEOService" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
     <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000" /> 
     <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> 
     <security mode="None"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> 
     <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" /> 
     </security> 
    </binding> 
    <binding name="WSHttpServiceMagicBinding" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
     <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000"/> 
     <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/> 
     <security mode="None"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/> 
     <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true"/> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

Sección de cliente del cliente:

<client> 
    <endpoint address="http://hydwebd02.solutions.com/GeoService.Saveology.com/ServiceMagicService.svc" 
     binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceMagicService" 
     contract="IServiceMagicService" name="WSHttpBinding_IServiceMagicService" /> 
</client> 

Sección de Servicios de servidor:

<services> 
    <service behaviorConfiguration="GeoService.Saveology.com.CityStateServiceProviderBehavior" 
    name="GeoService.Saveology.com.CityStateServiceProvider"> 
    <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_SEOService" 
     contract="SEO.Common.ServiceContract.ICityStateService" /> 
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" 
     contract="IMetadataExchange" /> 
    </service> 
    <service behaviorConfiguration="GeoService.Saveology.com.ServiceMagicServiceProviderBehavior" 
    name="GeoService.Saveology.com.ServiceMagicServiceProvider"> 
    <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpServiceMagicBinding" 
     contract="SEO.Common.ServiceContract.IServiceMagicService"> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" /> 
    </service> 
</services> 
+0

Bien, gracias - pero tendrá que publicar también la sección del servidor , y la sección del cliente , así que veremos cómo esos criterios de valoración se establecen y cómo se les está llamando .... .. –

+0

He publicado la sección de sectiona dn server's client también. – user82613

+0

¿Qué sucede cuando llamas a estos métodos con un cliente real? –

Respuesta

9

Tengo un problema similar, ¿ha intentado:

proxy.ClientCredentials.Windows.AllowedImpersonationLevel = 
      System.Security.Principal.TokenImpersonationLevel.Impersonation; 
0

Acabo de recibir este problema en una máquina de desarrollo (la producción funciona bien). Modifico mi configuración en IIS para permitir el acceso anónimo y poner mi nombre y contraseña como credencial.

No es la mejor manera, estoy seguro, pero funciona para fines de prueba.

6

Veo esto no es contestada sin embargo, esta es una cita exacta from here:

wsHttpBinding intentará realizar negociar un interno en la capa de SSP.Para que esto sea exitoso, deberá permitir el anonimato en IIS para el VDir. WCF ejecutará por defecto un SPNEGO para credenciales de ventana. Permitir el anonimato en la capa de IIS no permite que nadie entre, se difiere a la pila de WCF.

me encontré por: http://fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html

Tras Google: http://www.google.tt/#hl=en&source=hp&q=+The+HTTP+request+is+unauthorized+with+client+authentication+scheme+%27Anonymous

+0

Hola @Irwin, Gracias por la respuesta. ¿Podría proporcionarme una fuente más "oficial", como la documentación original producida por Microsoft, para justificar esto, a un auditor? ¡¡MUCHAS GRACIAS!! Marcelo –

70

no tenía control sobre la configuración de seguridad para el servicio que estaba llamando a, pero tiene el mismo error. Pude arreglar mi cliente de la siguiente manera.

  1. En la configuración, configurar el modo de seguridad:

    <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
    </security> 
    
  2. En el código, defina la clase de proxy para permitir la suplantación (he añadido una referencia a un servicio llamado cliente):

    Customer_PortClient proxy = new Customer_PortClient(); 
    proxy.ClientCredentials.Windows.AllowedImpersonationLevel =  
         System.Security.Principal.TokenImpersonationLevel.Impersonation; 
    
+2

Si lo hace mediante programación, asegúrese de utilizar el enlace Dim como nuevo System.ServiceModel.BasicHttpBinding() en lugar de Dim binding como New System.ServiceModel.WSHttpBinding() –

+1

Realmente no sé qué es un Customer_PortClient, pero estableciendo el modo de seguridad me ayudó. – Nathan

+0

¡La parte de seguridad también hizo el truco para mí! – nldev

3

Esto es lo que tuve que hacer para que esto funcione. Esto significa:

  1. UserNamePasswordValidator personalizado (sin necesidad de una cuenta de Windows, SQL Server o ActiveDirectory - UserNamePasswordValidator su nombre de usuario podría tener & contraseña codificada, o leer desde un archivo de texto, MySQL o lo que sea).
  2. https
  3. IIS7
  4. .net 4,0

Mi sitio es manejado a través DotNetPanel. Tiene 3 opciones de seguridad para los directorios virtuales:

  1. Permitir anónimos Acceso
  2. habilitar la autenticación básica
  3. Habilitar autenticación integrada de Windows

Sólo "Permitir acceso anónimo" se necesita (aunque, que, por sí solo no fue suficiente).

Configuración

proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 

no hacer una diferencia en mi caso.

Sin embargo, el uso de esta unión funcionó:

 <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Windows" /> 
     <message clientCredentialType="UserName" /> 
     </security>   
3

Otra posible solución a este error que he encontrado. Puede que no haya respondido la pregunta exacta de OP, pero puede ayudar a otros que encuentren este mensaje de error.

que estaba creando mi cliente en código usando WebHttpBinding, con el fin de replicar la siguiente línea:

<security mode="TransportCredentialOnly"> 
    <transport clientCredentialType="Windows" proxyCredentialType="Windows" /> 
</security> 

que tenía que hacer:

var binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly); 
       binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 
       binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Windows; 

, así como el establecimiento de proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

+0

¡Un gran consejo, gracias! No tengo idea de por qué esto fue rechazado. – CompanyDroneFromSector7G

1

Intente proporcionar el nombre de usuario y la contraseña en su cliente como debajo de

client.ClientCredentials.UserName.UserName = @ "Domain \ username"; client.ClientCredentials.UserName.Password = "contraseña";

0

Tuve el mismo error hoy, después de implementar nuestro servicio llamando a un servicio externo al entorno de ensayo en azul. El servicio local llamó al servicio externo sin errores, pero después del despliegue no lo hizo.

Al final resultó ser que el servicio externo tiene una validación de IP. El nuevo entorno en Azure tiene otra IP y fue rechazado.

Así que si alguna vez se llama a este error servicios externos

Podría ser una restricción de IP.

4

Tuve un problema similar e intenté con todo lo sugerido anteriormente. Luego intenté cambiar clientCreditialType por Basic y todo funcionó bien.

<basicHttpBinding> 
    <binding name="BINDINGNAMEGOESHERE" > 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Basic"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
Cuestiones relacionadas