2009-02-18 11 views
6

Ich habe einen WCF-Duplex-Service und Client geschrieben. Alles funktioniert gut, bis ich versuche, .Demand() in der Client-Implementierung aufzurufen. Es scheint, dass der Dienst die Rückrufmethode anonym aufruft. Ich denke, dass ich vermisse, wie man den Service richtig konfiguriert.Duplex-Callback ist immer anonym

Code zum Erstellen von 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!"); 

Code zum Erstellen des Clients;

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

Client-Implementierung:

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

Wie kann ich so konfiguriere, dass die Servicehost korrekt den Rückruf mit Windows-Anmeldeinformationen aufruft?

Antwort

0

Schaltet TokenImpersonationLevel auf Delegation statt auf Identitätswechsel? Wie folgt aus:

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

Siehe this MSDN article.

+0

Grabgräber? :) Die Frage wurde am 18. Februar 2009 gestellt und die Frage wurde wegen Inaktivität gelöscht. – abatishchev