2012-03-30 11 views
1

免責事項:.NET N00BWCF .Net C#のWSSE(ダイジェスト付き) - 簡単な方法ですか?

私は無駄にこの外部のベンダーのWebサービスとセキュリティの仕事を取得しようとしている今日のカップルのための壁に頭を叩いてきました。

<wsse:UsernameToken wsu:Id="Example-1"> 
    <wsse:Username> ... </wsse:Username> 
    <wsse:Password Type="..."> ... </wsse:Password> 
    <wsse:Nonce EncodingType="..."> ... </wsse:Nonce> 
    <wsu:Created> ... </wsu:Created> 
</wsse:UsernameToken> 

私はサービス参照を追加することによって開始し、多くの、多くのブログの記事を通じて、stackoverflowの質問:それは簡単に言えば、SOAPヘッダにこのような何かを追加し、セキュリティを、ダイジェスト彼らはWSSEを使用することが判明しますapp.configとコードを操作しています。私はちょうどそれを正しくするように見えなかった。多分それは容易に可能ではないでしょうか?たぶん、私はVisual Studio 2010と.Netについてよく分かりませんが、わかりません。ここで

は私のApp.configファイルにして停止したものです:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="ServiceHttpBinding" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
       messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
       useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <security mode="TransportWithMessageCredential" /> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="https://vendorurl" 
      binding="basicHttpBinding" bindingConfiguration="ServiceHttpBinding" 
      contract="ContractName" 
      name="ServiceHttpPort"> 
     </endpoint> 
    </client> 
</system.serviceModel> 

とC#:

var someService = new ServiceClient(); 

    someService.ClientCredentials.UserName.UserName = "username"; 
    someService.ClientCredentials.UserName.Password = "passwordgobbletygook/somemorebase64stuff="; 

    #region Begin Magic 
    var elements = someService.Endpoint.Binding.CreateBindingElements(); 

    var securityBindingElement = elements.Find<SecurityBindingElement>(); 
    securityBindingElement.IncludeTimestamp = false; 

    someService.Endpoint.Binding = new CustomBinding(elements); 
    #endregion 

    var response = someService.webMethod(param1, param2, param3, param4); 

    Console.WriteLine(response); 

面白いことは、仕様のベンダーでは、ですが、私は、彼らが奨励することがわかりました

:WSSJの使用、ので、私は私はそれがここで2時間

で働くようになった(Javaで)それを試してみたとは、それがどのように見えるかです

public class Test implements CallbackHandler { /** * @param args */ public static void main(final String[] args) throws Throwable { SomeService_Service someService_Service = new SomeService_Service(); SomeService someService = someService_Service.getSomeServiceHttpPort(); BindingProvider bindingProvider = (BindingProvider)someService; Map< String, Object > requestContext = bindingProvider.getRequestContext(); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://vendorurl"); Client client = ClientProxy.getClient(someService); Endpoint endpoint = client.getEndpoint(); Map< String, Object > outProps = new HashMap< String, Object >(); outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); outProps.put(WSHandlerConstants.USER, "username"); outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_DIGEST); outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new Test()); WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps); endpoint.getOutInterceptors().add(wssOut); System.out.println(someService.webMethod(param1, param2, param3, param4)); } public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException { WSPasswordCallback pc = (WSPasswordCallback)callbacks[ 0 ]; // set the password for our message. pc.setPassword("passwordgobbletygook/somemorebase64stuff="); } } 

stackoverflowの土地に誰かがこれを.NETで動作するようにしていますか?私がここで紛失していることは明らかですか?

+0

基本的な実装は次のようになります。私たちは昨年、Webサービスを開発しました。私たちは最終的にHTTPS:Sを介してBasic Authに切り替えるまで、数週間の実験でJavaパートナーを正しく接続できませんでした。私は、WS-Securityの仕様が実用には理想的ではないと感じています。 – mellamokb

+0

興味深いコメント@mellamokb。私はそれがJavaでうまく動作するようになった、それは私が仕事に得ることができなかった.Netコードです。この特定のベンダー(Taleo)は、他の多くのソフトウェアクライアントと相互に関連しており、セキュリティのためにこれを使用しているため、そこにいる誰かが動作する必要があります。 – javamonkey79

+0

私は何を意味するかを明らかにする。私は、.Netとnon.Netの言語間の相互運用を意味しました。 Java-to-Javaは、われわれが発見したように美しく動作し、.Net-to-.NETも同様に機能します。しかし、.NETをJavaにしようとしたとき、われわれはすべての種類の不明なエラーと条件に遭遇し、それをあきらめるまで頭を据えた。それは不可能だと言っているわけではありませんが、私はそのプロジェクトで苦労していることを覚えています。私はそれがどのように働くかを知ることに興味があります。私は自分自身のウェブサービスn00bの一部ですので、その一部になるかもしれません:) – mellamokb

答えて

3

.NETベースのコンポーネントをJAVAベースのSOAPサービスに接続しようとする前に、この問題が発生しました。私たちのソリューションはXML構築を必要とせず、IMHOは私が見てきたものよりも少し洗練されています。

古いバージョンの.NET DLLをダウンロードして組み込む必要があるという欠点があります。このコードは非常にきれいで、自然にWCFに適合しているという点が有益です。完全な説明はここで見つけることができ

using (OperationContextScope scope = new OperationContextScope(client.InnerChannel)) 
{ 
    //Class from WSE 3.0 
    UsernameToken token = new UsernameToken("MY_USERNAME", "MY_PASSWORD", PasswordOption.SendHashed); 

    //Add Auth to SOAP Header 
    MessageHeader header 
     = MessageHeader.CreateHeader(
     "Security", 
     "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", 
     token.GetXml(new XmlDocument()) 
    ); 

    OperationContext.Current.OutgoingMessageHeaders.Add(header); 

    //Build Request 
    OrgWS.OrganizationDetailsRequest request = new OrgWS.OrganizationDetailsRequest() 
    { 
     ID = 1 
    }; 

    //Send Request 
    OrgWS.OrganizationDetail[] response = client.getOrganizationDetail(request); 

    //Do something with response 
} 

::私はnon-.Net言語の相互運用のために働くためにWS-Securityを得たことがありませんhttp://cxdeveloper.com/article/implementing-ws-security-digest-password-nonce-net-40-wcf

+0

これは、ウェブを解き明かして答えを見つけたときに見つけた最もクリーンなソリューションです。 この回答は本当に感謝を得る必要があります! –

関連する問題