Вызов веб-службы Java WS-Security с клиентом C # - PullRequest
0 голосов
/ 25 ноября 2010

Я новичок в использовании WCF с безопасными сервисами.

Я пытаюсь подключиться к веб-сервису java с безопасным HTTPS-транспортом, и он использует WS-Security UsernamePassword Token Authentication.

Я пытаюсь соединиться с клиентом WCF, используя следующую привязку, но безуспешно.

<bindings>
  <wsHttpBinding>
    <binding name="OperationsEndpoint1Binding" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="524288" maxReceivedMessageSize="1015536"
        messageEncoding="Text" textEncoding="utf-8"
        useDefaultWebProxy="true">

      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />

        <security  mode="TransportWithMessageCredential">
          <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
          <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

У кого-нибудь есть решение для подключения к транспорту HTTPS java webservice и использования WS-SecurityПроверка подлинности токена очень ценится.

Ответы [ 2 ]

0 голосов
/ 26 мая 2016

Я сделал это с помощью wcf. Это помогло мне подключиться к мыльной веб-службе WebSphere ssl с аутентификацией токена имени пользователя WS-Security.

Если вы можете использовать .NET4.5 + и сервер поддерживает его, обязательно избегайте стандартного tls1.0 и используйте tls.1.1 или 1.2.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;


private static ChannelFactory<IContract> MyCreateFactory(String serviceAddress, 
                                                                String userName, 
                                                                X509Certificate2 clientCertificate, 
                                                                X509Certificate2 serviceCertificate, 
                                                                Int32 sendTimeoutMinutes){

// Custom Binding 
var myBinding = new CustomBinding
{
    SendTimeout = new TimeSpan(0, sendTimeoutMinutes, 0),
};
myBinding.Elements.Clear();

// asymmetric security
var mutual = SecurityBindingElement.CreateMutualCertificateDuplexBindingElement();
mutual.AllowInsecureTransport = true;
mutual.AllowSerializedSigningTokenOnReply = true;
mutual.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic128Rsa15;
mutual.EnableUnsecuredResponse = true;
mutual.IncludeTimestamp = false;
mutual.InitiatorTokenParameters = new X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient };
mutual.KeyEntropyMode = SecurityKeyEntropyMode.CombinedEntropy;
mutual.MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt;
mutual.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
mutual.RecipientTokenParameters = new X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.AlwaysToInitiator};
mutual.RequireSignatureConfirmation = false;
mutual.SecurityHeaderLayout = SecurityHeaderLayout.Lax;
mutual.LocalClientSettings.IdentityVerifier = new MyIdentityVerifier();
mutual.SetKeyDerivation(false);
// Sets in header the certificate that signs the Username
mutual.EndpointSupportingTokenParameters.Signed.Add(new UserNameSecurityTokenParameters());
mutual.MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt;
myBinding.Elements.Add(mutual);


var httpsBindingElement = new HttpsTransportBindingElement { RequireClientCertificate = true };
httpsBindingElement.ExtendedProtectionPolicy = new ExtendedProtectionPolicy(PolicyEnforcement.Never);
myBinding.Elements.Add(httpsBindingElement);


var factory = new ChannelFactory<IContract>(binding: myBinding, remoteAddress: serviceAddress);
var defaultCredentials = factory.Endpoint.Behaviors.Find<ClientCredentials>();
factory.Endpoint.Behaviors.Remove(defaultCredentials);

var clientCredentials = new ClientCredentials();
clientCredentials.UserName.UserName = userName;
clientCredentials.ClientCertificate.Certificate = clientCertificate; 
clientCredentials.ServiceCertificate.DefaultCertificate = serviceCertificate;
clientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
clientCredentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;

factory.Endpoint.Behaviors.Add(clientCredentials);

return factory;}
0 голосов
/ 07 июля 2011

Решение было не использовать WCF.Вместо этого я создал веб-запрос в стиле Http-запроса к веб-сервису в java , который работал.

Я до сих пор не нашел ничего в WCF, который бы поддерживал этот любопытный запрос.

...