我试图通过创建实现AuthSchemeFactory的NTLM引擎(遵循http://hc.apache.org/httpcomponents-client-4.3.x/ntlm.html上的说明)来使用具有NTLM身份验证的SOAP服务,并最终将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();

最佳答案

带有FLASK的NTLM Auth的示例Python实现。

如果要与Java一起使用,请运行以下独立的flask代码,并通过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)

09-10 09:14
查看更多