Войти с помощью IAuthorizationPolicy и UserNamePasswordValidator с данными заголовка?

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

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

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

evaluationContext.Properties["Principal"] = userContext;

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

Я знаю, что могу использовать 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);

1 ответ

Решение

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

WebOperationContext.Current.IncomingRequest.Headers 
Другие вопросы по тегам