2010-11-24 2 views
0

Я новичок в использовании WCF с защищенными службами.Вызов веб-службы WS-Security Java с клиентом C#

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

Я пытаюсь соединиться с клиентом 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> 

ли кто-нибудь есть решение для подключения к Java вебсервис HTTPS транспорта и использования WS-Security UsernamePassword Токен аутентификации высоко ценится.

ответ

0

Решение не должно использоваться WCF. Вместо этого я создал веб-запрос что-то вроде строк Http request to web service in java, которые работали.

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

0

Я сделал это с помощью wcf. Это работало для меня, чтобы подключиться к веб-сервису ssl ssl WebSphere с помощью аутентификации Token Authentication с помощью 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;}