Web Services 使用具有NTLM身份验证的SOAP服务

sycxhyv7  于 2023-11-22  发布在  其他
关注(0)|答案(3)|浏览(218)

我尝试通过创建一个NTLM引擎(按照http://hc.apache.org/httpcomponents-client-4.3.x/ntlm.html上的说明)来使用一个带有NTLM身份验证的SOAP服务,该引擎实现了AuthSchemeFactory,并最终将AuthSchemeFactory注册到我的HTTP客户端。当我使用HTTP客户端访问该服务时,我得到一个响应“Status code - 415,Message - The server cannot service the request because the media type is unsupported”。
有人能告诉我如何解决这个问题不受支持的媒体消费一个受NTLM保护的SOAP Web服务在Java平台上.使用JCIFS是一个正确的选择来conmbloom受保护的服务或有任何更好的方法(S).提前感谢.

  1. DefaultHttpClient httpclient = new DefaultHttpClient();
  2. httpclient.getAuthSchemes().register(AuthSchemes.NTLM,
  3. new JCIFSNTLMSchemeFactory());
  4. CredentialsProvider credsProvider = new BasicCredentialsProvider();
  5. NTCredentials ntcred = new NTCredentials("USERNAME", "PASSWORD",
  6. "HOST", "DOMAIN");
  7. credsProvider.setCredentials(new AuthScope("HOST", 443,
  8. AuthScope.ANY_REALM, "NTLM"), ntcred);
  9. httpclient.setCredentialsProvider(credsProvider);
  10. httpclient.getParams().setParameter(
  11. CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
  12. Writer writer = new StringWriter();
  13. writer.write("MY SOAP REQUEST BODY");
  14. HttpPost httppost = new HttpPost(
  15. "https://<HOST_NAME>/XiPay30WS.asmx");
  16. httppost.setEntity(new StringEntity(writer.toString()));
  17. httppost.setHeader("Content-Type",
  18. "application/x-www-form-urlencoded");
  19. HttpResponse httpresponse = httpclient.execute(
  20. new HttpHost("HOST", 443, "https"),
  21. httppost, new BasicHttpContext());
  22. String statusCode = httpresponse.getStatusCode();

字符串

j5fpnvbx

j5fpnvbx1#

如果您使用Spring WS支持:
检查此解决方案http://dolszewski.com/spring/sharepoint-web-services-spring-and-ntlm-authentication/

  1. @Bean("navisionMessageSender")
  2. public HttpComponentsMessageSender httpComponentsMessageSender() {
  3. HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender();
  4. String user = env.getProperty("navision.endpoint.user");
  5. String password = env.getProperty("navision.endpoint.password");
  6. String domain = env.getProperty("navision.endpoint.domain");
  7. NTCredentials credentials = new NTCredentials(user, String.valueOf(password), null, domain);
  8. httpComponentsMessageSender.setCredentials(credentials);
  9. return httpComponentsMessageSender;
  10. }

字符串

sqougxex

sqougxex2#

在Apache HttpClient 5的情况下,您应该使用HttpClient 5MessageClient

  1. org.apache.hc.client5.http.auth.NTCredentials
  2. org.springframework.ws.transport.http.HttpComponents5MessageSender

字符串
例如Kotlin

  1. val httpComponentsMessageSender = HttpComponents5MessageSender()
  2. httpComponentsMessageSender.setCredentials(NTCredentials(user,
  3. password.toCharArray(),
  4. workstation,
  5. credentials.domain))

unhi4e5o

unhi4e5o3#

示例python实现,使用NTFS Auth with FLASK。
如果你想使用java,运行下面的独立flask代码,并通过http请求从java代码调用url(例如POST请求/dora/httpWithNTLM)

  1. from flask import Flask, render_template, flash, request, url_for, redirect, session , Response
  2. import requests,sys,json
  3. from requests_ntlm import HttpNtlmAuth
  4. app = Flask(__name__)
  5. @app.route("/dora/httpWithNTLM",methods=['POST'])
  6. def invokeHTTPReqWithNTLM():
  7. url =""
  8. reqData = json.loads(request.data)
  9. reqxml=request.data
  10. headers = {}
  11. headers["SOAPAction"] = "";
  12. headers["Content-Type"] = "text/xml"
  13. headers["Accept"] = "text/xml"
  14. print("req headers "+str(request.headers))
  15. r = requests.Request("POST",url,auth=HttpNtlmAuth('domain\\username','password'), data=reqxml, headers=headers)
  16. prepared = r.prepare()
  17. s = requests.Session()
  18. resp = s.send(prepared)
  19. print (resp.status_code)
  20. return Response(resp.text.replace("&lt;","<").replace("&gt;",">"),resp.status_code)
  21. if __name__ == '__main__':
  22. app.run(host="0.0.0.0",port=5001)

字符串

展开查看全部

相关问题