Настраиваемая безопасность сообщений WCF

Мне нужно использовать метод опроса, чтобы уведомить клиентов об изменениях на стороне сервера. Поэтому я попытался использовать DuplexHttpBinding (http://code.msdn.microsoft.com/duplexhttp ). Я отлично работаю с незащищенными сообщениями, но мне нужно использовать безопасность на уровне сообщений в моем проекте (UsernameForCertificate). Хорошо, я решил добавить SymmetricSecurityBindingElement в коллекцию привязок:

 var securityElement = SecurityBindingElement.CreateUserNameForCertificateBindingElement();
collection.Add(securityElement);

А потом случилась проблема. Если мы используем безопасность на уровне сообщений, все сообщения включают заголовки безопасности с подписью сообщения, например:

<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
....
</o:Security>

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

System.ServiceModel.Security.MessageSecurityException, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
No signature message parts were specified for messages with the 'http://samples.microsoft.com/duplexhttp/pollingAction' action.

Пожалуйста, посоветуйте обходной путь, как добавить правильные заголовки безопасности к моим пользовательским сообщениям опроса перед отправкой их в канал пользовательского запроса. Вы можете загрузить исходный код по ссылке, опубликованной ранее, и просто попытаться использовать его с защитой UsernameForCertificate, чтобы воспроизвести проблему. Спасибо.


person albicelestial    schedule 25.03.2010    source источник


Ответы (1)


Через пару дней и глубоких исследований я нашел решение. Кажется, что мы должны изменить ChannelProtectionRequirements при создании пользовательских каналов Facroty и Channel Listener, чтобы добавить части шифрования и подписи в наши пользовательские сообщения. Вот образец:

 private static void ApplyChannelProtectionRequirements(BindingContext context)
    {
        var cpr = context.BindingParameters.Find<ChannelProtectionRequirements>();
        if (cpr != null)
        {
            XmlQualifiedName qName = new XmlQualifiedName("customHeader", "namespace");
            MessagePartSpecification part = new MessagePartSpecification(qName);
            cpr.IncomingEncryptionParts.AddParts(part, "incomingAction");
            cpr.IncomingSignatureParts.AddParts(part, "incomingAction");
            cpr.OutgoingEncryptionParts.AddParts(part, "outgoingAction");
            cpr.OutgoingSignatureParts.AddParts(part, "outgoingAction");
        }
    }
person albicelestial    schedule 30.03.2010
comment
Где вы вызываете свой частный метод ApplyChannelProtectionRequirements?. - person Jaime Hablutzel; 19.11.2017