2011-02-07 31 views
11

Mientras que llamar a un servicio web me sale el siguiente error:La solicitud HTTP no está autorizado con esquema de autenticación del cliente NTLM '

The HTTP request is unauthorized with client authentication scheme 'NTLM'. The authentication header received from the server was 'NTLM'. The HTTP request is unauthorized with client authentication scheme 'NTLM'. The authentication header received from the server was 'NTLM'.

tengo un 4 aplicación Silverlight que llame a un servicio web WCF, tanto en mi IIS (7) mi servicio web WCF llama a otro servicio web ASMX, instalado en un servidor web diferente, utilizando NTLM (Autenticación de Windows). Ambos servidores, el mío y el que aloja el servicio web ASMX están en el mismo dominio.

Cuando el cliente de Silverlight abre la aplicación desde el servidor usando http://localhost/MySiteName todo funciona bien. Pero cuando el cliente de Silverlight abre la aplicación desde un cliente diferente, que no es el servidor pero sigue en el mismo dominio, usando http://MyServerName/MySiteName, entonces aparece el error.

Autenticación de Windows está habilitada en mi IIS. La autenticación anónima está deshabilitada en mi IIS.

configuración de enlace para llamar a mi servicio web WCF es:

<binding name="winAuthBasicHttpBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 

configuración de enlace para llamar al servicio Web ASMX es:

<binding name="ClNtlmBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Ntlm" /> 
     </security> 
    </binding> 
+0

configuración de enlace para llamar a mi servicio web WCF es : configuración de enlace para llamar al servicio web ASMX es: kruvi

Respuesta

18

OK, aquí son las cosas que vienen a la mente:

  • Su servicio WCF presuntamente ejecutándose en IIS debe ejecutarse bajo el contexto de seguridad que tiene el privilegio tha t llama al servicio web. Debe asegurarse en el grupo de aplicaciones con un usuario que sea un usuario de dominio, idealmente un usuario dedicado.
  • No puede utilizar suplantación de usar token de seguridad del usuario para pasar de nuevo a ASMX se utiliza la suplantación ya my WCF web service calls another ASMX web service, installed on a **different** web server
  • Intente cambiar Ntlm a Windows y probar de nuevo.

bien, unas palabras sobre la suplantación. Básicamente es un problema conocido que no puede usar los tokens de suplantación que recibió en un servidor para pasarlos a otro servidor. El motivo parece ser que el token es una especie de hash que usa la contraseña del usuario y es válido para la máquina generada, por lo que no se puede usar desde el servidor del medio.


ACTUALIZACIÓN

Delegación es posible bajo WCF (suplantación es decir, el reenvío de un servidor a otro servidor). Mira este tema here.

+0

Gracias. Cuando configuro un usuario de dominio para el grupo de aplicaciones funciona bien, pero ahora todas mis llamadas al WS se ejecutan bajo el usuario del dominio del grupo de aplicaciones. ¿No puedo llamar al ASMX ws utilizando suplantación, por lo que la llamada se ejecuta con el token de seguridad del usuario del cliente? – kruvi

+0

Por cierto, olvidé mencionar que cuando se usa la suplantación con un usuario específico (el mismo usuario que está conectado al cliente) todo funciona bien: client = new ClCustomersServiceClient(); client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; client.ClientCredentials.Windows.ClientCredential = new NetworkCredential ("nombre de usuario", "contraseña", "dominio"); respuesta = cliente.ClCustomersQuery (solicitud); – kruvi

+0

He actualizado, eche un vistazo. – Aliostad

7

Ha pasado mucho tiempo desde que se publicó la pregunta, pero experimenté el mismo problema en un escenario similar. Tengo una aplicación de consola y estaba consumiendo un servicio web y nuestro servidor IIS donde se colocó el servicio web tiene habilitada la autenticación de Windows (NTLM).

Seguí this link y eso solucionó mi problema.Aquí está el código de ejemplo para App.config:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="Service1Soap"> 
       <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Ntlm" proxyCredentialType="None" 
         realm=""/> 
        <message clientCredentialType="UserName" algorithmSuite="Default"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost/servicename/service1.asmx" 
      binding="basicHttpBinding" bindingConfiguration="ListsSoap"/> 
    </client> 
</system.serviceModel> 
0

1) que tenía que hacer lo siguiente con mi configuración: (Añadir BackConnectionHostNames o desactivación de bucle invertido de verificación) http://support.microsoft.com/kb/896861

2) que estaba trabajando fuera de un sistema de desarrollo de una red de desarrollo aislada. Lo había hecho funcionar usando el nombre de la computadora del sistema de desarrollo en la URL del servicio web, pero cuando modifiqué la URL a la URL que se utilizaría en la producción (en lugar del nombre de la computadora), comencé a recibir el error NTLM.

3) Noté que el registro de seguridad mostraba que la cuenta de servicio no iniciaba sesión con un error similar al del artículo de MSDN.

4) La adición de BackConnectionHostNames lo hizo para que pudiera iniciar sesión en el servidor a través de un navegador que se ejecuta en el servidor, pero la cuenta de servicio aún tenía errores NTLM al intentar autenticarse para los servicios web. Terminé deshabilitando el cheque de vuelta y eso lo solucionó por mí.

0

Tal vez se puede hacer referencia a: http://msdn.microsoft.com/en-us/library/ms731364.aspx Mi solución es cambiar las propiedades 2 AuthenticationScheme y proxyAuthenticationScheme a "NTLM", y entonces funciona.

PS: Mi entorno es como sigue - Del lado del servidor: .net 2.0 ASMX - Del lado del cliente: .net 4

1

que tenía que mover de dominio, nombre de usuario, contraseña de

client.ClientCredentials.UserName.UserName = domain + "\\" + username; client.ClientCredentials.UserName.Password = password

a

client.ClientCredentials.Windows.ClientCredential.UserName = username; client.ClientCredentials.Windows.ClientCredential.Password = password; client.ClientCredentials.Windows.ClientCredential.Domain = domain;

2

Para mí, la solución fue además de usar "Ntlm" como tipo de credencial, similar a la solución de Jeroen K. Si tuviera el nivel de permiso que lo haría más en su puesto, pero me deja publicar toda mi código aquí, que apoyará a Windows y otros tipos de credenciales como autenticación básica:

XxxSoapClient xxxClient = new XxxSoapClient(); 
    ApplyCredentials(userName, password, xxxClient.ClientCredentials); 

    private static void ApplyCredentials(string userName, string password, ClientCredentials clientCredentials) 
    { 
     clientCredentials.UserName.UserName = userName; 
     clientCredentials.UserName.Password = password; 
     clientCredentials.Windows.ClientCredential.UserName = userName; 
     clientCredentials.Windows.ClientCredential.Password = password; 
     clientCredentials.Windows.AllowNtlm = true; 
     clientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
    } 
Cuestiones relacionadas