MessageSecurityException: элемент заголовка безопасности 'Timestamp' с '' id должен быть подписан - PullRequest
0 голосов
/ 18 июня 2010

Я задаю тот же вопрос, который я уже задавал на форумах msdn http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/70f40a4c-8399-4629-9bfc-146524334daf

Я использую (скорее всего, основанную на Java) веб-службу, и у меня нет абсолютно никакого доступа для изменения. Он не будет изменен, хотя я бы их спросил (это общенациональная система).

Я написал клиент с WCF. Вот некоторый код:

CustomBinding binding = new CustomBinding();
AsymmetricSecurityBindingElement element = SecurityBindingElement.CreateMutualCertificateDuplexBindingElement(MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10);
element.AllowSerializedSigningTokenOnReply = true;
element.SetKeyDerivation(false);
element.IncludeTimestamp = true;
element.KeyEntropyMode = SecurityKeyEntropyMode.ClientEntropy;
element.MessageProtectionOrder = System.ServiceModel.Security.MessageProtectionOrder.SignBeforeEncrypt;
element.LocalClientSettings.IdentityVerifier = new CustomIdentityVerifier();
element.SecurityHeaderLayout = SecurityHeaderLayout.Lax;
element.IncludeTimestamp = false;

binding.Elements.Add(element);
binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8));
binding.Elements.Add(new HttpsTransportBindingElement());

EndpointAddress address = new EndpointAddress(new Uri("url"));

ChannelFactory<MyPortTypeChannel> factory = new ChannelFactory<MyPortTypeChannel>(binding, address);

ClientCredentials credentials = factory.Endpoint.Behaviors.Find<ClientCredentials>();

credentials.ClientCertificate.Certificate = myClientCert;
credentials.ServiceCertificate.DefaultCertificate = myServiceCert;
credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

service = factory.CreateChannel();

После этого каждый запрос к службе завершается с ошибкой на стороне клиента (я могу подтвердить, что мой запрос принят службой и возвращается здравый ответ)

Я всегда получаю следующее исключение

MessageSecurityException: безопасность элемент заголовка 'Timestamp' с '' ID должен быть подписан.

Глядя на трассировку, я вижу, что в ответе действительно есть элемент метки времени, но в разделе безопасности есть только подпись для тела.

Можно ли как-нибудь сделать WCF, чтобы принять во внимание тот факт, что отметка времени не подписана?

Ответы [ 2 ]

0 голосов
/ 07 июля 2010

Я разобрался с этим, ответ можно найти здесь: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/371184de-5c05-4c70-8899-13536d8f5d16

Основные моменты: добавьте пользовательский StrippingChannel к пользовательской привязке, чтобы убрать метку времени из заголовка безопасности и настроить WCF, чтобы он не обнаруживалсяотвечает.

0 голосов
/ 18 июня 2010

Вы можете попробовать использовать контракт на сообщение WCF.Когда у вас есть контракт на сообщение, вы можете указать, что элементы в заголовке должны быть подписаны:

[MessageContract]
public class CustomType
{
[MessageHeader(ProtectionLevel = ProtectionLevel.Sign)]
string name;

[MessageHeader(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
string secret;
...