Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Windows集成身份验证web服务的Java客户端调用_Java_Security_Axis2_Windows Authentication_Credentials - Fatal编程技术网

对Windows集成身份验证web服务的Java客户端调用

对Windows集成身份验证web服务的Java客户端调用,java,security,axis2,windows-authentication,credentials,Java,Security,Axis2,Windows Authentication,Credentials,我正在编写一个Java1.5+客户端,它需要从IIS托管的web服务中获取数据。我在Eclipse中创建了一个新的web服务客户机,并在生成客户机代理时使用Java代理客户机类型和Apache Axis2 web服务运行时。web服务本身在Windows 2003上运行,安全设置为仅使用Windows集成身份验证。我在网上找到了许多文章,展示了如何成功地从Java客户端连接到此IIS服务,但我所看到的一切似乎都要求我在Java客户端代码中的某个地方输入用户名和密码 我的Java客户端将运行在与I

我正在编写一个Java1.5+客户端,它需要从IIS托管的web服务中获取数据。我在Eclipse中创建了一个新的web服务客户机,并在生成客户机代理时使用Java代理客户机类型和Apache Axis2 web服务运行时。web服务本身在Windows 2003上运行,安全设置为仅使用Windows集成身份验证。我在网上找到了许多文章,展示了如何成功地从Java客户端连接到此IIS服务,但我所看到的一切似乎都要求我在Java客户端代码中的某个地方输入用户名和密码

我的Java客户端将运行在与IIS服务所在的Active Directory网络相同的Windows计算机上(即,我每天登录的帐户可以访问该服务)。我希望Java客户端在登录用户的上下文中运行,而无需在代码中输入登录凭据。这是我当前的代码,它可以工作,但需要我在代码中输入用户名和密码:

final NTCredentials nt = new NTCredentials("my_username", "my_password", "", "my_domain");
        final CredentialsProvider myCredentialsProvider = new CredentialsProvider() {
            public Credentials getCredentials(final AuthScheme scheme, final String host, int port, boolean proxy) throws CredentialsNotAvailableException {
                return nt; 
            }
        };

        DefaultHttpParams.getDefaultParams().setParameter("http.authentication.credential-provider", myCredentialsProvider);
但我真的不想在代码中输入用户名和密码——我希望它使用运行Java客户端的登录Windows用户的凭据运行


我应该使用什么代码来连接登录用户的凭据,而无需指定用户名和密码?这可能吗?

您描述的功能不是操作系统的功能,而是Internet Explorer的功能。您可能应该更好地了解“Windows身份验证”的实际工作原理(也称为NLTM HTTP身份验证)。JCIFS正在删除向servlet容器提供此功能的ServletFilter。然而,他们的建议是有帮助的


一旦您了解了身份验证的工作方式,就可以实现某种Axis插件来提供该功能。

您描述的功能不是操作系统的功能,而是Internet Explorer的功能。您可能应该更好地了解“Windows身份验证”的实际工作原理(也称为NLTM HTTP身份验证)。JCIFS正在删除向servlet容器提供此功能的ServletFilter。然而,他们的建议是有帮助的


一旦您了解了身份验证的工作方式,就可以实现某种Axis插件来提供功能。

我使用Axis已经有几年了,Axis依赖于Apache commons httpclient 3。从一些邮件列表来看,它看起来像。(如果不是,最后一段应该会提供一些令人欢迎的缓解。)

Apache commons httpclient 3不支持HTTP上的“集成Windows身份验证”(又名Kerberos协商身份验证机制,又名“SPNEGO”)。事实上,它不支持NTLMv2,只支持NTLMv1,这意味着您将无法在不进行修改的情况下对许多需要NTLMv2的IIS服务器进行身份验证

尽管无可否认这是一个严厉的解决方案,但我认为最好的办法是创建一个新的AuthScheme,调用Windows SSPI库来进行身份验证。不幸的是,您需要使用JNI来实现这一点。幸运的是,AuthScheme已经准备好执行基于会话的质询-响应身份验证模式(SPNEGO在这方面与NTLM类似,NTLM已经得到了支持)。基本上,您将base64编码输入和输出字节缓冲区到本机InitializeSecurityContext调用。我承认写起来很乏味,但我可以确认它确实允许您对IIS服务器执行集成Windows身份验证

(不幸的是,如果您需要跨平台的客户端,还需要在Unix上编写必要的GSSAPI代码。)

另一个选择是编写一个使用Java的Kerberos库(JAAS)的新AuthScheme。老实说,我对这些不太了解,因为它需要与系统kerberos库分开配置。在Windows上,您必须编写一些指向Active Directory服务器的kerberos配置文件。在我看来,这听起来并不那么“综合”。如果您将软件分发给客户,而他们希望它“正常工作”,这可能不适合您。另外,尽管JAAS已经存在了一段时间,但我相信早期版本缺少一些与Active Directory通信所需的身份验证机制,因此我认为您需要一个Java6运行时


现在,如果我弄错了,您可以将Axis2与新的ApacheHTTP组件httpclient 4一起使用,那么您的状态会更好。httpclient 4使用Java的Kerberos库支持SPNEGO,这意味着您不必编写自己的AuthScheme,只需配置C:\WINDOWS\KRB5.INI,就可以利用集成的WINDOWS身份验证。但是,为了避免手动配置JAAS,您仍然需要调用本机SSPI方法。

我使用Axis已经有几年了,Axis依赖于Apache commons httpclient 3。从一些邮件列表来看,它看起来像。(如果不是,最后一段应该会提供一些令人欢迎的缓解。)

Apache commons httpclient 3不支持HTTP上的“集成Windows身份验证”(又名Kerberos协商身份验证机制,又名“SPNEGO”)。事实上,它不支持NTLMv2,只支持NTLMv1,这意味着您将无法在不进行修改的情况下对许多需要NTLMv2的IIS服务器进行身份验证

尽管无可否认这是一个严厉的解决方案,但我认为最好的办法是创建一个新的AuthScheme,调用Windows SSPI库来进行身份验证。不幸的是,您需要使用JNI来实现这一点。幸运的是,AuthScheme已经准备好执行基于会话的质询-响应身份验证模式(SPNEGO在这方面与NTLM类似,NTLM已经得到支持)。基本上,您将对输入和输出字节buf进行base64编码