java - CXF - 如何使用 CXF 3.2.6 正确配置 Spnego

标签 java authentication cxf kerberos spnego

我正在尝试创建一个 CXF Soap Web 服务客户端,以使用经过 Kerberos 身份验证的 SharePoint 实例进行 Soap 调用。

我导入以下内容:

  • org.apache.cxf:cxf-rt-frontend-jaxws:3.2.6
  • org.apache.cxf:cxf-rt-transsports-http:3.2.6
  • org.apache.cxf:cxf-rt-transsports-http-hc:3.2.6
  • org.apache.cxf:cxf-rt-ws-security:3.2.6

这是我的java程序。

import crawler.common.sharepoint.stubs.lists.Lists;
import crawler.common.sharepoint.stubs.lists.ListsSoap;
import org.apache.cxf.configuration.jsse.TLSClientParameters;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit;
import org.apache.cxf.transport.http.auth.HttpAuthHeader;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.apache.cxf.ws.security.wss4j.KerberosTokenInterceptor;

import javax.xml.ws.BindingProvider;
import javax.xml.ws.Service;

public class SharepointKerberosTesterClient {

  public static void main(String[] args) {
    System.setProperty("java.security.krb5.conf", "/home/ndipiazza/xxxx/spnego-http-client/krb5.conf");
    System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
    System.setProperty("java.security.auth.login.config", "/home/ndipiazza/xxxx/spnego-http-client/login.conf");

    String endpoint = "http://win-qbfsb933r5p/_vti_bin/Lists.asmx";
    Service service = Service.create(Lists.SERVICE);
    ListsSoap soap = service.getPort(ListsSoap.class);
    BindingProvider bindingProvider = (BindingProvider) soap;

    bindingProvider.getRequestContext().put(AsyncHTTPConduit.USE_ASYNC,
        Boolean.TRUE);
    bindingProvider.getRequestContext().put(
        BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint);

    Client client = ClientProxy.getClient(bindingProvider);
    client.getEndpoint().put("org.apache.cxf.stax.maxChildElements", System.getProperty("org.apache.cxf.stax.maxChildElements") != null
        ? System.getProperty("org.apache.cxf.stax.maxChildElements") : "5000000");
    HTTPConduit http = (HTTPConduit) client.getConduit();

    AuthorizationPolicy authorization = new AuthorizationPolicy();
    authorization.setAuthorization("SharePoint");
    authorization.setAuthorizationType(HttpAuthHeader.AUTH_TYPE_NEGOTIATE);
    http.setAuthorization(authorization);

    HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
    httpClientPolicy.setAllowChunking(false);
    httpClientPolicy.setAutoRedirect(true);

    TLSClientParameters tlsClientParameters = new TLSClientParameters();
    tlsClientParameters.setDisableCNCheck(true);

    http.setTlsClientParameters(tlsClientParameters);

    http.setClient(httpClientPolicy);

    System.out.println("Size of lists: " + soap.getListCollection().getContent().size());

  }
}

如果您看一下这个示例,http://cxf.apache.org/docs/jaxrs-kerberos.html#JAXRSKerberos-AuthorizationPolicy有一个特殊的类 KerberosAuthOutInterceptor 可以根据需要添加协商授权 header 。

但在 CXF 3.1.x 和 3.2.x 版本中,这似乎不存在。

相反,有一个 https://github.com/apache/cxf/blob/master/rt/ws/security/src/main/java/org/apache/cxf/ws/security/policy/interceptors/SpnegoTokenInterceptorProvider.java我认为我应该使用它。

但我不知道如何使用拦截器提供程序。有谁知道如何将其与 CXF 的编程(非 xml)声明一起使用?

最佳答案

SharePoint部署在IIS上,IIS绝对可以进行Kerberos身份验证。所以我怀疑这是一个 SharePoint 问题 - 您能分享您对为什么这么认为的见解吗?我调试此问题的方法是,我将使用标志 -Dsun.security.krb5.debug=true 启动您的客户端(不肯定与您正在使用的类一起使用)。但尝试监听 header ,服务器应该发送 WWW-Authenticate。客户端提供的响应(您可以在 SharePoint 服务器上的调试日志中查看)对于 Kerberos 应该是 YII,对于 NTLM 应该是 TIRM。因此,如果 Kerberos 配置以 TIRM 开头,那么您的 Kerberos 配置就会出现问题。您可能必须通过 IIS 启用连接调试才能查看此信息。

关于java - CXF - 如何使用 CXF 3.2.6 正确配置 Spnego,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51974176/

相关文章:

jax-rs - WebApplicationException 未显示错误消息

java - Java中分割数字的有效方法

java - 我的游戏中的文本编辑文本输入问题

java - 如何在 selenium 中处理 chrome 中的身份验证弹出窗口

git - 不能再推送到 github origin master

java - Apache CXF - 给定的 SOAPAction 与操作不匹配

java - SOAP:将方法从 AXIS 1.4 迁移到 CXF 以添加新 header

java - 如何用 for 循环做到这一点

java - @SuppressWarnings - 静态变量

python - 如何在不下载服务帐户凭据的情况下从 Google Compute Engine 和本地验证 Google API(Google Drive API)?