3

我想知道在 NTLM 身份验证期间使用的 6 个参数中可以自动化哪些参数,它们是:

“用户名” - 用于登录当前使用的操作系统配置文件的用户名。-已经自动化,使用System.getProperty("user.name")

“密码” - 同上。-可能无法自动化,但我永远不确定,直到我尝试询问......

“ProxyAddress” - 身份验证“握手”以便通过的代理的地址。-我已经伪自动化,但它的固定代码,因此很糟糕。

“ProxyPort” - 前面解释过的代理上的侦听端口。-我已经伪自动化,但它的固定代码,因此很糟糕。

“工作站” - 我的电脑在本地网络中的 ID 或其他东西......我目前正在使用我的机器的属性 ID,它正在工作,但我不知道它是否正确的值,或者是否需要一个值首先。-不知道如何自动化,但我知道这是可能的。需要帮忙

“域” - 不知道它指的是哪个域,因此不知道它应该具有什么价值......将其留空似乎正在工作...... -不知道如何自动化,但我知道这是可能的。需要帮忙

额外信息:我正在为该过程使用 HtmlClient 库,包括身份验证。

DefaultCredentialsProvider credentialProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
    credentialProvider.addNTLMCredentials(username, password, proxyAddress, proxyPort, workstation, domain);
    webClient.setUseInsecureSSL(true);
4

1 回答 1

9

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

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

    System.getProperty("user.name");
    

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

    System.getEnv("USERNAME");
    

    或者你可以使用这个com.sun.security.auth.module.NTSystem

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

  3. 用于指定 HTTP 代理的 Java 机制使用http.proxyHost系统属性

    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系统属性相同

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

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

    System.getEnv("USERDOMAIN");
    

    或者你可以使用这个NTSystem类:

    new NTSystem().getDomain();
    

唷。

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

可以使用Java Kerberos功能执行单点登录(无需密码),但是我没有成功,因为 Java 需要显式 Kerberos 配置(并且不使用主机的配置)并且它没有实现一些所需的密码通过活动目录。(或者这是我的理解。)

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

于 2012-04-04T21:41:18.613 回答