技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

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 も噛んでるらしいので今後に期待っと。