【问题标题】:Consuming soap service with NTLM Authentication使用 NTLM 身份验证使用soap服务
【发布时间】:2016-06-06 15:15:43
【问题描述】:

我正在尝试通过创建 NTLM 引擎(按照 http://hc.apache.org/httpcomponents-client-4.3.x/ntlm.html 上的说明)来使用具有 NTLM 身份验证的 SOAP 服务,以实现 AuthSchemeFactory 并最终将 AuthSchemeFactory 注册到我的 HTTP 客户端。当我使用 HTTP 客户端访问服务时,我收到“状态代码 - 415,消息 - 服务器无法为请求提供服务,因为媒体类型不受支持。”的响应。

谁能告诉我如何解决这个不受支持的媒体问题,以便在 Java 平台上使用受 NTLM 保护的 SOAP Web 服务。使用 JCIFS 是使用 NTLM 保护服务的正确选项,还是有更好的方法。提前致谢。

    DefaultHttpClient httpclient = new DefaultHttpClient();

    httpclient.getAuthSchemes().register(AuthSchemes.NTLM,
            new JCIFSNTLMSchemeFactory());

    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    NTCredentials ntcred = new NTCredentials("USERNAME", "PASSWORD",
            "HOST", "DOMAIN");

    credsProvider.setCredentials(new AuthScope("HOST", 443,
            AuthScope.ANY_REALM, "NTLM"), ntcred);

    httpclient.setCredentialsProvider(credsProvider);

    httpclient.getParams().setParameter(
            CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");

    Writer writer = new StringWriter();
        writer.write("MY SOAP REQUEST BODY");

    HttpPost httppost = new HttpPost(
            "https://<HOST_NAME>/XiPay30WS.asmx");
    httppost.setEntity(new StringEntity(writer.toString()));

    httppost.setHeader("Content-Type",
                "application/x-www-form-urlencoded");

    HttpResponse httpresponse = httpclient.execute(
                new HttpHost("HOST", 443, "https"),
                httppost, new BasicHttpContext());

    String statusCode = httpresponse.getStatusCode();

【问题讨论】:

    标签: java web-services soap axis ntlm


    【解决方案1】:

    如果你使用 Spring WS 支持:

    检查此解决方案 http://dolszewski.com/spring/sharepoint-web-services-spring-and-ntlm-authentication/

    @Bean("navisionMessageSender")
    public HttpComponentsMessageSender httpComponentsMessageSender() {
        HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender();
        String user = env.getProperty("navision.endpoint.user");
        String password = env.getProperty("navision.endpoint.password");
        String domain = env.getProperty("navision.endpoint.domain");
        NTCredentials credentials = new NTCredentials(user, String.valueOf(password), null, domain);
        httpComponentsMessageSender.setCredentials(credentials);
        return httpComponentsMessageSender;
    }
    

    【讨论】:

      【解决方案2】:

      使用带有 FLASK 的 NTLM Auth 的示例 python 实现。

      如果您想与 java 一起使用,请运行下面的独立烧瓶代码并通过 http 请求从 java 代码调用 url(例如 POST 请求 /dora/httpWithNTLM )

      from flask import  Flask, render_template, flash, request, url_for, redirect, session , Response
      import requests,sys,json
      from requests_ntlm import HttpNtlmAuth
      app = Flask(__name__)
      
      
      
      
      @app.route("/dora/httpWithNTLM",methods=['POST'])
      def invokeHTTPReqWithNTLM():
          url =""
          reqData = json.loads(request.data)        
          reqxml=request.data
          headers = {}
          headers["SOAPAction"] = "";
          headers["Content-Type"] = "text/xml"
          headers["Accept"] = "text/xml"
          print("req headers "+str(request.headers))
      
          r = requests.Request("POST",url,auth=HttpNtlmAuth('domain\\username','password'), data=reqxml, headers=headers) 
      
          prepared = r.prepare()
          s = requests.Session()
          resp = s.send(prepared)
          print (resp.status_code)
          return Response(resp.text.replace("&lt;","<").replace("&gt;",">"),resp.status_code)
      
      
      
      
      if __name__ == '__main__':
          app.run(host="0.0.0.0",port=5001)
      

      【讨论】:

        猜你喜欢
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        • 2018-04-29
        • 1970-01-01
        • 2016-07-05
        • 1970-01-01
        相关资源
        最近更新 更多