2016-02-22 6 views
5

У меня есть служба WCF, где я использую пользовательский UserNamePasswordValidator для проверки пользователя.Войти с IAuthorizationPolicy и UserNamePasswordValidator с данными заголовка?

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

Когда это сделано IAuthorizationPolicy.Evaluate срабатывает и это, где я поставил принципала в контекст пользовательского пользователя, как это:

evaluationContext.Properties["Principal"] = userContext; 

Проблема заключается в том, что мне нужно 2 вещи, чтобы получить правильный пользовательский текст, и это имя пользователя и значение из заголовка.

Я знаю, что я могу использовать messageinspector, чтобы получить данные заголовка, как это:

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"); 
     } 

Но мне нужно, чтобы получить эту информацию в методе Evaluate, так что я могу сделать правильный логин (набор основной). Является ли это возможным? И если да, то как? Какая альтернатива?

PS. Это будет сделано путем вызова, поэтому не может быть использован какой-либо конкретный метод входа.

Решено:

Я закончил с этим:

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

Один подвох я могу думать в AfterReceiveRequest извлекать значения из заголовка и установить его на claimset идентичности, а затем в Оценивать извлечь его из claimset идентичности и использовать его, как вы. Я не пробовал, но думаю, это должно сработать. –

ответ

1

Вы можете попытаться получить доступ к данным заголовка с этим?

WebOperationContext.Current.IncomingRequest.Headers