JAX-WS客户端的Kerberos身份验证标头

时间:2014-10-25 16:34:40

标签: web-services jax-ws kerberos wsimport spnego

我使用ws-import生成我的Web服务,以连接到我在IIS上使用Kerberos保护的aspx服务。 当我使用SOAPConnection

连接到服务时,我能够连接并验证正常
final SOAPConnection conn = SOAPConnectionFactory.newInstance().createConnection();
try {
    final MessageFactory msgFactory = MessageFactory.newInstance();
    final SOAPMessage message = msgFactory.createMessage();

    final MimeHeaders headers = message.getMimeHeaders();
    if (spnegoToken != null) {
        headers.addHeader("SOAPAction", "http://tempuri.org/HelloWorld");
        headers.addHeader("Authorization", "Negotiate " + Base64.encode(spnegoToken));
    }
   message.getSOAPBody().addBodyElement(new QName("http://tempuri.org/", "HelloWorld", "tem"));
   final SOAPMessage response = conn.call(
       message, "http://server:9994/WebService/SampleService.asmx");
   return response.getSOAPBody().getTextContent();
   } finally {
       conn.close();
   }

但是我无法以相同的方式向JAXWS生成的WS添加Authorization标头:

   final SampleServiceSoap sss= new SampleService().getSampleServiceSoap();
   ((BindingProvider) sss).getRequestContext().put(
       "Authorization", "Negotiate " + Base64.encode(spnegoToken));
   return sss.helloWorld();

我收到401错误作为令牌,因为我看不到附加在Wireshark中的令牌。 任何人都可以指出我应采取的方法吗? 干杯, 百里

1 个答案:

答案 0 :(得分:2)

排序,结果我非常接近:

final Map<String, List<String>> headers = new HashMap<String, List<String>>();

headers.put("Authorization", Collections.singletonList("Negotiate " + Base64.encode(tgt)));

((BindingProvider) sss).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, headers);