我想知道在NTLM身份验证期间使用的6个参数可以自动化,这些参数是:
“用户名” - 用于登录当前正在使用的操作系统配置文件的用户名。 - 已使用System.getProperty("user.name")
“密码” - 与上述相同。 - 可能无法实现自动化,但在尝试询问之前我永远不会确定...
“ProxyAddress” - 代理的地址,为了通过,身份验证被“握手”。 - 我已经伪自动化了,但它的固定代码却很糟糕。
“ProxyPort” - 先前解释的代理上的侦听端口。 - 我已经伪自动化了,但它的固定代码却很糟糕。
“工作站” - 我的PC在本地网络中的ID或其他东西......我正在使用我的机器的属性ID及其工作,但我不知道它是否正确值,或者是否有需要首先是价值。 - 不知道如何自动化,但我知道这是可能的。需要帮助
“域名” - 不知道它指的是哪个域,因此不知道它应该具有什么价值...留空似乎正在工作...... - 不知道如何自动化,但我知道它是可能。需要帮助
EXTRA INFO:我正在使用HtmlClient库进行处理,包括身份验证。
DefaultCredentialsProvider credentialProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
credentialProvider.addNTLMCredentials(username, password, proxyAddress, proxyPort, workstation, domain);
webClient.setUseInsecureSSL(true);
答案 0 :(得分:9)
我有点假设你在谈论Apache HTTPClient和HTLMUnit,但我的假设是基于你提供的代码中的方法签名,所以我道歉,如果我'我错了。
对于NTLM,这是远程用户名,不一定是本地主机上当前登录的用户。我怀疑这些用户在您的方案中是相同的,但我确实想指出这一点。在这种情况下,是的,使用user.name
系统属性将提供当前登录用户的名称:
System.getProperty("user.name");
在Windows上,您还可以使用USERNAME
环境变量:
System.getEnv("USERNAME");
或者您可以使用com.sun.security.auth.module.NTSystem
class:
new NTSystem.getName();
您无法获取用户密码。但是,您可能仍然可以在用户不需要提供密码的情况下执行单点登录(详情请参阅下文。)
用于指定HTTP代理的Java机制正在使用http.proxyHost
system property:
String proxyHost = System.getProperty("http.proxyHost");
请注意,您还应该检查http.nonProxyHosts
系统属性。
某些JRE(立即考虑Mac OS)将根据系统代理设置设置这些系统属性。如果您的JRE未设置此项,则可能需要尝试从其他来源确定代理。在Unix系统上,您可能希望使用HTTP_PROXY
环境变量。在Windows系统上,您可能最好使用ProxySelector
类,如this stackoverflow post中所述。
与http.proxyHost
系统属性类似,Java机制与http.proxyPort
system property:
int proxyPort = Integer.parseInt(System.getProperty("http.proxyPort"));
为了在Unix上可靠地获取主机名,不幸的是,你应该通过JNI或exec gethostname(2)
来调用/usr/bin/hostname
。在Windows上,您可以使用COMPUTERNAME
环境变量:
System.getEnv("COMPUTERNAME");
您可以获取本地计算机加入的域名,但是(没有提示用户),没有办法自动获取您所在机器的域名重新认证。当然,如果您的本地工作站和身份验证目标位于同一个域中,那么这是没有意义的。因此,在Windows上,您可以使用USERDOMAIN
环境变量:
System.getEnv("USERDOMAIN");
或者您可以使用NTSystem
类:
new NTSystem().getDomain();
呼。
至于实施“单点登录”(这样用户无需提供密码):
您可能能够使用Java Kerberos功能执行单点登录(无需密码),但是由于Java需要显式的Kerberos配置,因此我没有成功使用主机的配置)并没有实现Active Directory所需的某些密码。 (或者那就是我的理解。)
您还可以使用JNI调用InitializeSecurityContext
并在WWW-Authenticate
标头中传递生成的令牌,使用NTLM或SPNEGO(Kerberos)执行单点登录。