2010-11-24 16 views
0

セキュリティで保護されたサービスでWCFを使用するのは初めてのことです。C#クライアントでWS-Security Java Webサービスを呼び出す

セキュリティで保護されたHTTPS転送を使用してJava Webサービスに接続しようとしていますが、WSセキュリティのUsernamePasswordトークン認証が使用されています。

次のバインディングを使用して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のWebサービスのHTTPSトランスポートに接続するソリューションを持っているし、感謝WS-SecurityのUsernamePasswordトークン認証を使用しています。

答えて

0

解決策はWCFを使用しないことでした。代わりに私はHttp request to web service in javaの行に沿ってWebリクエストを作成しました。

このような要求をサポートしているWCFにはまだ何も見つかりませんでした。

0

私はwcfを使用しました。 これはWS-Securityユーザー名トークン認証を使用してWebSphere ssl soap Webサービスに接続するのに役立ちました。

.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;}