WCF Webサービスに、JavaからWindows 認証してみる
とりあえず、統合Windows認証にしとくと非常にタチが悪いので、NTLM(Kerberos抜きのWindows認証)設定をWCF側に設定しとく。
このとき、認証を、Messageではなくて、TransportOnlyにしておいた。
wsHttpBinding では、どうも TransportOnly ができない、、、。
Message 認証で何とかできた人は是非教えて欲しい。
で、WCF 側の設定。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <compilation debug="true" /> </system.web> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="NewBinding0"> <security mode="TransportCredentialOnly"> <transport clientCredentialType="Ntlm" /> </security> </binding> </basicHttpBinding> </bindings> <services> <service behaviorConfiguration="SampleService.Service1Behavior" name="SampleService.Service1"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="NewBinding0" contract="SampleService.IService1"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="http://localhost:8731/Design_Time_Addresses/SampleService/Service1/" /> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name="SampleService.Service1Behavior"> <serviceMetadata httpGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="True" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
ここから、Java 側になるが、とりあえずは、NetBeans を突っ込む。
Java1.6 と同一パッケージのものを入れると、プラグイン的に不満があるので、それぞれ個別のパッケージで落として設定。
プロジェクトを作ったら、「プロパティ」「ライブラリの追加」をかけて、JAX-WS を選択。
その後、プロジェクトを右クリックして、「新規」→「Webサービスのクライアント」。
WSDL の URL 引っ張って貼り付けする。
で、ここからがキモ。
おもむろにクラスを追加。「MyAuth」とか適当につくる。
そしたら以下のような形でコーディング。
public class MyAuth extends java.net.Authenticator { @Override protected java.net.PasswordAuthentication getPasswordAuthentication () { return new java.net.PasswordAuthentication ("username", "password".toCharArray()); } }
で、Main メソッドだかの先頭に、
java.net.Authenticator.setDefault(new MyAuth());
こんな感じにしとけば、認証して、データ拾えるようになる。
@はソースコードの適当なところで、「右クリック」→「Webサービスクライアントの…」でも貼り付ければOK。
どうでもいいが、取り出したデータの要素アクセス階層が深いのが面倒だと思う。
JAX-WS は Microsoft も噛んでるらしいので今後に期待っと。