2010-11-24 35 views
0

Je suis nouveau à l'utilisation de WCF avec des services sécurisés.Appel d'un service Web WS-Security Java avec C# Client

J'essaye de me connecter à un webservice java avec le transport HTTPS sécurisé et il utilise WS-Security UsernamePassword Token Authentication.

J'ai essayé de me connecter au client WCF en utilisant la liaison suivante sans succès.

<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> 

Est-ce que quelqu'un a une solution pour la connexion au transport HTTPS java webservice et utiliser l'authentification par jeton UsernamePassword WS-Security beaucoup apprécié.

Répondre

0

La solution n'était pas d'utiliser WCF. Au lieu de cela, j'ai créé une requête Web quelque chose sur le modèle de Http request to web service in java qui a fonctionné.

Je n'ai toujours rien trouvé dans WCF qui supporte cette demande un peu.

0

Je l'ai fait en utilisant wcf. Cela m'a permis de me connecter à un service web WebSphere ssl soap avec l'authentification par jeton WS-Security Username.

Si vous pouvez utiliser .NET4.5 +, et le serveur le prend en charge, veillez à éviter la version par défaut tls1.0 et à utiliser tls.1.1 ou 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;}