2016-02-22 30 views
5

Ho un servizio WCF in cui utilizzo un UserNamePasswordValidator personalizzato per convalidare l'utente.Login con IAuthorizationPolicy e UserNamePasswordValidator con dati di intestazione?

public override void Validate(string userName, string password) 
     { 
      LoginHelper loginHelper = new LoginHelper(); 
      loginHelper.ValidateUserRegularLogin(userName, password); 
     } 

Quando questo è fatto l'IAuthorizationPolicy.Evaluate viene attivato e questo è dove ho impostato il preside ad un contesto utente personalizzato come questo:

evaluationContext.Properties["Principal"] = userContext; 

Il problema è che ho bisogno di 2 cose per ottenere il corretto usercontext e questo è username e un valore dall'intestazione.

So che posso usare un messageinspector per ottenere i dati di intestazione come questo:

public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext) 
     { 
      IntegrationHeader integrationHeader; 
      LoginHandler loginHandler; 
      UserContextOnService userContext = null; 

      if (request.Headers.Action == null || request.Headers.Action.ToString().Length < 1) 
       return null; 

      foreach (var header in request.Headers) 
      { 
       if (header.Namespace == "ns" && header.Name == "SecurityToken") 
       { 

        return null; 
       } 
      } 

      throw new SecurityTokenException("Unknown username or invalid password"); 
     } 

Ma ho bisogno di ottenere queste informazioni nel metodo Valutare in modo da poter fare un login corretto (set principale). È possibile? E se sì, come? Qual è l'alternativa?

PS. Ciò avverrà tramite chiamata in modo che non possa essere utilizzato alcun metodo di accesso specifico.

risolto:

ho finito con questo:

integrationHeader = OperationContext.Current.IncomingMessageHeaders.GetHeader<IntegrationCertificateHeader>(header.Name, header.Namespace); 
+0

Un trucco sporco che posso pensare è in AfterReceiveRequest di estrarre i valori da intestazione e impostarlo su claimset di identità e poi in Valutare estrarlo dalla claimset di identità e di utilizzarlo nel modo desiderato. Non l'ho provato ma immagino che dovrebbe funzionare. –

risposta

1

Puoi provare a accedere ai dati di intestazione con questo?

WebOperationContext.Current.IncomingRequest.Headers