【问题标题】:What parameters for an NTLM authentication can be automatized , and how to do it with java?NTLM 身份验证的哪些参数可以自动化,以及如何使用 java 来实现?
【发布时间】:2012-04-04 18:42:09
【问题描述】:

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

【问题讨论】:

    标签: java authentication automation ntlm


    【解决方案1】:

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

    1. 对于 NTLM,这是 remote 用户名,不一定是本地主机上当前登录的用户。我怀疑这些是您场景中的同一用户,但我确实想指出这一点。在这种情况下,是的,使用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 调用 gethostname(2) 或执行 /usr/bin/hostname。在 Windows 上,您可以使用 COMPUTERNAME 环境变量:

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

      System.getEnv("USERDOMAIN");
      

      或者您可以使用NTSystem 类:

      new NTSystem().getDomain();
      

    哇哦。

    关于实现“单点登录”(用户无需提供密码):

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

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

    【讨论】:

    • 优秀的答案!帮助很大!我向你鞠躬,爱德华爵士——太棒了! :)
    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多