Безопасность пользовательских сообщений WCF - PullRequest
1 голос
/ 25 марта 2010

Мне нужно использовать технику опроса, чтобы уведомлять клиентов об изменениях на стороне сервера. Поэтому я попытался использовать 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, чтобы воспроизвести проблему. Спасибо.

1 Ответ

2 голосов
/ 30 марта 2010

После нескольких дней и глубокого изучения я нашел решение. Кажется, что мы должны изменить ChannelProtectionRequirements при создании пользовательских Channel 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");
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...