可以自动化NTLM身份验证的哪些参数,以及如何使用java进行自动化?

时间:2012-04-04 18:42:10

标签: java authentication automation ntlm

我想知道在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);

1 个答案:

答案 0 :(得分:9)

我有点假设你在谈论Apache HTTPClientHTLMUnit,但我的假设是基于你提供的代码中的方法签名,所以我道歉,如果我'我错了。

  1. 对于NTLM,这是远程用户名,不一定是本地主机上当前登录的用户。我怀疑这些用户在您的方案中是相同的,但我确实想指出这一点。在这种情况下,是的,使用user.name系统属性将提供当前登录用户的名称:

    System.getProperty("user.name");
    

    在Windows上,您还可以使用USERNAME环境变量:

    System.getEnv("USERNAME");
    

    或者您可以使用com.sun.security.auth.module.NTSystem class

    new NTSystem.getName();
    
  2. 您无法获取用户密码。但是,您可能仍然可以在用户不需要提供密码的情况下执行单点登录(详情请参阅下文。)

  3. 用于指定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中所述。

  4. http.proxyHost系统属性类似,Java机制与http.proxyPort system property

    int proxyPort = Integer.parseInt(System.getProperty("http.proxyPort"));
    
  5. 为了在Unix上可靠地获取主机名,不幸的是,你应该通过JNI或exec gethostname(2)来调用/usr/bin/hostname。在Windows上,您可以使用COMPUTERNAME环境变量:

    System.getEnv("COMPUTERNAME");
    
  6. 您可以获取本地计算机加入的域名,但是(没有提示用户),没有办法自动获取您所在机器的域名重新认证。当然,如果您的本地工作站和身份验证目标位于同一个域中,那么这是没有意义的。因此,在Windows上,您可以使用USERDOMAIN环境变量:

    System.getEnv("USERDOMAIN");
    

    或者您可以使用NTSystem类:

    new NTSystem().getDomain();
    
  7. 呼。

    至于实施“单点登录”(这样用户无需提供密码):

    可能能够使用Java Kerberos功能执行单点登录(无需密码),但是由于Java需要显式的Kerberos配置,因此我没有成功使用主机的配置)并没有实现Active Directory所需的某些密码。 (或者那就是我的理解。)

    您还可以使用JNI调用InitializeSecurityContext并在WWW-Authenticate标头中传递生成的令牌,使用NTLM或SPNEGO(Kerberos)执行单点登录。