2009-08-13 15 views
7

tengo algo de código que intenta hacerse pasar por la configuración de seguridad de remitentes ventanas y luego conectar a otro servicio WCF en una máquina diferenteWCF error de Windows de seguridad de autenticación

WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity; 
using (callerWindowsIdentity.Impersonate()) 
{ 
    NetTcpBinding binding = new NetTcpBinding(); 
    binding.Security.Mode = SecurityMode.Message; 
    binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 
    EndpointAddress endpoint = new EndpointAddress(new Uri("net.tcp://serverName:9990/TestService1")); 
    ChannelFactory<WCFTest.ConsoleHost.IService1> channel = new ChannelFactory<WCFTest.ConsoleHost.IService1>(binding, endpoint); 
    WCFTest.ConsoleHost.IService1 service = channel.CreateChannel(); 
    return service.PrintMessage(msg); 
} 

pero me sale el error: "la persona que llama no era autenticada por el servicio " System.ServiceModel .... La solicitud de token de seguridad no pudo ser satisfecha porque la autenticación falló ...

Las credenciales que intento suplantar son valide windows credencial para la casilla en la que se encuentra el servicio .

¿Alguna idea de por qué?

Respuesta

0

Suplantación de su servicio a la siguiente es un problema complicado, conocido como problema de "doble salto".

No tengo una respuesta final para eso (normalmente lo evito usando una cuenta de servicio explícita para el servicio que necesita llamar a otro servicio).

PERO: definitivamente debe consultar el WCF Security Guidance en CodePlex y buscar "Suplantación" - hay bastantes artículos allí que explican todos los pormenores de suplantar a un llamador original y por qué es complicado.

Marc

1

De acuerdo con marc_s este es el problema de doble salto.

que necesita para obtener la autentificación de las ventanas hasta el final, por lo tanto:

  • La solicitud debe hacerse en el contexto de un usuario de Windows
  • IIS debe estar configurado para utilizar la autenticación de Windows
  • Web.config debe configurarse para la autenticación de Windows con impersonate = true
  • El usuario con el que se ejecuta el grupo de aplicaciones debe poder suplantar a un usuario. Este es el lugar habitual donde se produce el problema del doble salto.

Hay una derecha llamado "Suplantar a un cliente tras la autenticación"

http://blogs.technet.com/askperf/archive/2007/10/16/wmi-troubleshooting-impersonation-rights.aspx

0

Si está seguro de que usted tiene las credenciales correctas en ambos saltos, la siguiente cosa que podría ser la causa del El problema es la falta de EndpointDnsIdentity en el punto final.

DnsEndpointIdentity identity = new DnsEndpointIdentity("localhost"); // localhost is default. Change if your service uses a different value in the service's config. 
Uri uri = new Uri("net.tcp://serverName:9990/TestService1"); 
endpoint = new EndpointAddress(uri, identity, new AddressHeaderCollection()); 
3

Con el fin de apoyar su escenario, es necesario tener una comprensión de cómo Protocol Transition y Constrained Delegation trabajo. Tendrá que configurar tanto Active Directory como su endpoint (s) del servicio WCF para soportar esto. Tenga en cuenta el uso del nombre principal del servicio (SPN). Eche un vistazo al siguiente enlace y vea si lo ayudan. El artículo tiene una muestra para demostrar la configuración completa de extremo a extremo requerida para que esto funcione.

How To: Impersonate the Original Caller in WCF Calling from a Web Application

Cuestiones relacionadas