Мне нужно использовать веб-сервис Java с .NET. Запросы должны быть подписаны, и сертификат должен быть включен в запрос.
При использовании метода 'GetClient', приведенного ниже, запрос генерируется правильно, за исключением одного поля.
В элементе SecurityTokenReference добавлен KeyIdentifier.
Это поле SecurityTokenReference должно содержать поле «Ссылка» для третьего ссылки в элементе «SignedInfo»:
</o:Security>
</s:Header>
<o:BinarySecurityToken>...</o:BinarySecurityToken>
<Signature>
<SignedInfo>
<CanonicalizationMethod></CanonicalizationMethod>
<SignatureMethod></SignatureMethod>
<Reference URI="#_1">...</Reference>
<Reference URI="#uuid-001">...</Reference>
<Reference URI="#uuid-002">...</Reference>
</SignedInfo>
<SignatureValue>...</SignatureValue>
<KeyInfo>
<o:SecurityTokenReference>
<o:KeyIdentifier >...</o:KeyIdentifier>
</o:SecurityTokenReference>
</KeyInfo>
</Signature>
</o:Security>
</s:Header>
So
<o:SecurityTokenReference>
<o:KeyIdentifier >...</o:KeyIdentifier>
</o:SecurityTokenReference>
Должно быть
<o:SecurityTokenReference>
<o:Reference ValueType="..." URI="uuid-002" />
</o:SecurityTokenReference>
Однако я не могу заставить это работать.
При использовании
InitiatorTokenParameters InclusionMode = SecurityTokenInclusionMode.Once
добавлен правильный тег «Ссылка», но затем создается двойной тег «BinarySecurityToken», в результате чего веб-служба отклоняется.
Есть ли какое-то решение для этого?
public wsClient GetClient()
{
CustomBinding b = new CustomBinding();
HttpsTransportBindingElement transport = new HttpsTransportBindingElement();
AsymmetricSecurityBindingElement asec = (AsymmetricSecurityBindingElement)SecurityBindingElement.CreateMutualCertificateBindingElement
(MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10);
asec.SetKeyDerivation(false);
asec.AllowInsecureTransport = true;
asec.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic256;
asec.IncludeTimestamp = true;
asec.ProtectTokens = true;
asec.SecurityHeaderLayout = SecurityHeaderLayout.Lax;
asec.InitiatorTokenParameters = new X509SecurityTokenParameters
{
InclusionMode = SecurityTokenInclusionMode.Never, //.Once, ----> Once creates correct SecurityTokenReference, but double BinarySecurityToken
ReferenceStyle = SecurityTokenReferenceStyle.Internal
};
asec.EndpointSupportingTokenParameters.Signed.Add(new X509SecurityTokenParameters());
TextMessageEncodingBindingElement textMessageEncoding = new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8);
b.Elements.Add(asec);
b.Elements.Add(textMessageEncoding);
b.Elements.Add(transport);
string url = "https://service";
var c = new wsClient(b, new EndpointAddress(new Uri(url),
new DnsEndpointIdentity(kgParams.DnsEndpointIdentity), new AddressHeaderCollection()));
X509Certificate cert = GetCertificate();
c.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(cert);
c.ClientCredentials.ServiceCertificate.DefaultCertificate = c.ClientCredentials.ClientCertificate.Certificate;
c.Endpoint.Contract.ProtectionLevel = System.Net.Security.ProtectionLevel.Sign;
return c;
}