2010-04-22 7 views
3

J'ai un service WCF qui doit connaître le principal de l'utilisateur appelant.WCF - Passing CurrentPrincipal dans l'en-tête

Dans le constructeur du service je:

Principal = OperationContext.Current.IncomingMessageHeaders.GetHeader<MyPrincipal>("myPrincipal", "ns"); 

et dans le code d'appel je quelque chose comme:

 using (var factory = new ChannelFactory<IMyService>(localBinding, endpoint)) 
     { 
      var proxy = factory.CreateChannel(); 
      using (var scope = new OperationContextScope((IContextChannel)proxy)) 
      { 
       var customHeader = MessageHeader.CreateHeader("myPrincipal", "ns", Thread.CurrentPrincipal); 
       OperationContext.Current.OutgoingMessageHeaders.Add(customHeader); 

       newList = proxy.CreateList(); 
      } 
     } 

Tout cela fonctionne très bien.

Ma question est, comment puis-je éviter d'avoir à envelopper tous les appels de méthode proxy dans le using (var scope...{ [create header and add to OperationContext]? Puis-je créer une ChannelFactory personnalisée qui gérera l'ajout de l'en-tête myPrincipal au contexte de l'opération? Quelque chose comme ça sauverait une charge entière de copier/coller que je préfère ne pas faire, mais je ne suis pas sûr de savoir comment y parvenir :)

Merci

Répondre

3

Le temps correct de définir un principal WCF est par IAuthorizationPolicy, en spécifiant une stratégie personnalisée dans la configuration. Ceci couvert entièrement here. Si vous essayez de définir le principal à d'autres points (un inspecteur, peut-être), il peut être réinitialisé par le système.