2009-02-18 5 views
6

Ho scritto un servizio duplex WCF e un client. Tutto funziona bene finché non provo a chiamare .Demand() nell'implementazione del client. Sembra che il servizio invochi il metodo di callback anonimo. Penso che mi manca come configurare correttamente il servizio.La richiamata fronte-retro è sempre anonima

Codice utilizzato per creare 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!"); 

Codice utilizzato per creare client;

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(); 

implementazione Cliente:

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

Come posso configurare in modo che il ServiceHost invoca correttamente la richiamata con credenziali di Windows?

risposta

0

Imposta TokenImpersonationLevel su Delega invece di rappresentazione? In questo modo:

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

Vedere this MSDN article.

+0

Scavatrice di tombe? :) La domanda è stata posta il 18 febbraio 2009 e l'utente è stato cancellato per inattività, credo molto tempo fa. – abatishchev

Problemi correlati