2009-02-18 12 views
6

He escrito un servicio dúplex WCF y un cliente. Todo funciona bien hasta que intento llamar a .Demand() en la implementación del cliente. Parece que el servicio invoca el método de devolución de llamada de forma anónima. Creo que me falta cómo configurar correctamente el servicio.La devolución de llamada dúplex es siempre anónima

Código utilizado para crear ServiceHost;

ServiceHost duplex = new ServiceHost(new ServerWCallbackImpl());   
NetTcpBinding secureBinding = new NetTcpBinding(SecurityMode.Message); 
secureBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 
duplex.AddServiceEndpoint(typeof(IServerWithCallback), 
    secureBinding, 
    "net.tcp://localhost:9080/DataService"); 
Console.WriteLine(Thread.CurrentPrincipal.Identity.Name); //<-- this correctly shows the current principal 
duplex.Open(); 
if (duplex.State == CommunicationState.Opened) 
    ((ServerWCallbackImpl)duplex.SingletonInstance).Send("Hello World!"); 

Código utilizado para crear el cliente;

CallbackImpl callbackInstance = new CallbackImpl(); 
NetTcpBinding secureBinding = new NetTcpBinding(SecurityMode.Message); 
secureBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 
DuplexChannelFactory<IServerWithCallback> cf = new DuplexChannelFactory<IServerWithCallback>(
    callbackInstance, 
    secureBinding, 
    new EndpointAddress(requestingEndpointAddress));   
cf.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation; 
cf.Credentials.Windows.ClientCredential = (NetworkCredential)CredentialCache.DefaultCredentials; 
IServerWithCallback srv = cf.CreateChannel(new InstanceContext(callbackInstance)); 
srv.InitiateConversation(); 

aplicación de cliente:

public void MethodOnClient(string message) 
{ 
    Console.WriteLine(Thread.CurrentPrincipal.Identity.Name); // <-- anonymous 
    PrincipalPermission p = new PrincipalPermission(@"DOMAIN\User", null); 
    p.Demand(); // <-- fails 
} 

¿Cómo puedo configurar para que el ServiceHost invoca correctamente el número de regreso con las credenciales de Windows?

Respuesta

0

¿La configuración de TokenImpersonationLevel es Delegación en lugar de Suplantación? De esta manera:

cf.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation; 

Ver this MSDN article.

+0

Grave digger? :) La pregunta fue hecha el 18 de febrero de 2009 y el usuario que preguntaba fue eliminado por inactividad, supongo que hace mucho tiempo. – abatishchev

Cuestiones relacionadas