axis2客户端NTLM身份验证
我有一个 axis2 (v1.5.3) 客户端,需要使用 IIS 进行 Kerberos/NTLM 身份验证。我该怎么做?这是我现在拥有的代码,它失败并出现 401 - 未经授权
错误:
List<String> authScheme = new ArrayList<String>();
authScheme.add(HttpTransportProperties.Authenticator.NTLM);
HttpTransportProperties.Authenticator ntlm =
new HttpTransportProperties.Authenticator();
ntlm.setAuthSchemes(authScheme);
ntlm.setUsername("Administrator");
ntlm.setPassword("password");
ntlm.setHost("http://server/_vti_bin/someservice.asmx");
ntlm.setPort(80);
ntlm.setDomain("server_domain");
Options options = webs._getServiceClient().getOptions();
options.setProperty(HTTPConstants.AUTHENTICATE, ntlm);
stub._getServiceClient().setOptions(options);
用 C# 编写的客户端可以在相同的身份验证设置下正常工作:
CredentialCache myCache = new CredentialCache();
myCache.Add(new Uri(webs.Url), "NTLM",
new NetworkCredential("Administrator", "password", "server_domain"));
stub.Credentials = myCache;
I have an axis2 (v1.5.3) client that needs to do Kerberos/NTLM authentication with IIS. How can I do this? This is the code I have right now and it fails with 401 - unauthorized
error:
List<String> authScheme = new ArrayList<String>();
authScheme.add(HttpTransportProperties.Authenticator.NTLM);
HttpTransportProperties.Authenticator ntlm =
new HttpTransportProperties.Authenticator();
ntlm.setAuthSchemes(authScheme);
ntlm.setUsername("Administrator");
ntlm.setPassword("password");
ntlm.setHost("http://server/_vti_bin/someservice.asmx");
ntlm.setPort(80);
ntlm.setDomain("server_domain");
Options options = webs._getServiceClient().getOptions();
options.setProperty(HTTPConstants.AUTHENTICATE, ntlm);
stub._getServiceClient().setOptions(options);
A client written in C# works fine with the same auth settings:
CredentialCache myCache = new CredentialCache();
myCache.Add(new Uri(webs.Url), "NTLM",
new NetworkCredential("Administrator", "password", "server_domain"));
stub.Credentials = myCache;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
AXIS2 中的 NTLM 存在问题。它以 ntlm.setHost() 方法为中心。此处的条目既用作 NTLM 交换中的工作站,也用作创建 AuthScope 时的远程主机。这会造成第 22 条军规 (Catch-22) 情况,其中 NTLM 无法使用 HttpTransportProperties.Authenticator 技术工作。您要么收到“401 未经授权”,要么收到“未找到@HOST 的凭据”。
请参阅https://issues.apache.org/jira/browse/AXIS2-4595
彼得
There is a problem with NTLM in AXIS2. It centres around the ntlm.setHost() method. The entry here is used as both WORKSTATION in the NTLM exchange and as Remote Host when AuthScope is created. This creates a Catch-22 situation where NTLM does not work using the HttpTransportProperties.Authenticator technique. You either get a "401 unauthorized" or you get a "No credentials found for < REALM>@HOST".
See https://issues.apache.org/jira/browse/AXIS2-4595
Peter
HttpClient 不支持 NTLM v2,因此我使用 JCIFS 库返回 NTLM v1,2,3 消息类型,如本网站所述
http://devsac.blogspot.com/2010/10/supoprt-for-ntlmv2-with-apache.html
我刚刚使用了 JCIFS_NTLMScheme.java 文件在上面的网站上注册身份验证方案并且它有效!!!
示例客户端:
HttpClient doesnt support NTLM v2 hence I use JCIFS library to return NTLM v1,2,3 message type as described in this website
http://devsac.blogspot.com/2010/10/supoprt-for-ntlmv2-with-apache.html
I just used the JCIFS_NTLMScheme.java file from the above website to register the auth scheme and it worked !!!!
Sample client:
根据此链接中的注释Axis2 的 NTLM 问题
我放弃了 Axis2 并使用 CXF 代替。
以下链接确实帮助我们解决了 Kerboros/NTLM 问题
Based on the notes at this link NTLM issues with Axis2
I gave up on Axis2 and used CXF instead.
The following link really us get past the Kerboros/NTLM issues
JCIFS 的替代方法是使用 Apache HTTPComponents 4 NTLMScheme(它与新的NTLM)位于自定义 Apache Commons HTTP AuthScheme 中:
用法
我在 Windows Server 2008 R2 上的 IIS 7.5 上对此进行了测试。
An alternative to JCIFS is to use the Apache HTTPComponents 4 NTLMScheme (which works with new NTLM) inside a custom Apache Commons HTTP AuthScheme:
Usage
I tested this on IIS 7.5 on Windows Server 2008 R2.