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

Xen*_*oRo 3 java authentication automation ntlm

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

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

"密码" - 与上述相同.- 可能不能自动化,但我一直都不确定,直到我试着问...

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

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

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

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

额外信息:我正在使用HtmlClient库进行处理,包括身份验证.

DefaultCredentialsProvider credentialProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
    credentialProvider.addNTLMCredentials(username, password, proxyAddress, proxyPort, workstation, domain);
    webClient.setUseInsecureSSL(true);
Run Code Online (Sandbox Code Playgroud)

Edw*_*son 9

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

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

    System.getProperty("user.name");
    
    Run Code Online (Sandbox Code Playgroud)

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

    System.getEnv("USERNAME");
    
    Run Code Online (Sandbox Code Playgroud)

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

    new NTSystem.getName();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您无法获取用户的密码.但是,您可能仍然可以在用户不需要提供密码的情况下执行单点登录(以下更多信息).

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

    String proxyHost = System.getProperty("http.proxyHost");
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,您还应该检查http.nonProxyHosts系统属性.

    一些JRE(立即想到Mac OS)将根据系统代理设置设置这些系统属性.如果您的JRE未设置此项,则可能需要尝试从其他来源确定代理.在Unix系统上,您可能希望使用HTTP_PROXY环境变量.在Windows系统上,您可能最好使用ProxySelector该类,如此stackoverflow文章中所述.

  4. http.proxyHost系统属性类似,Java机制具有http.proxyPort系统属性:

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

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

    System.getEnv("USERDOMAIN");
    
    Run Code Online (Sandbox Code Playgroud)

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

    new NTSystem().getDomain();
    
    Run Code Online (Sandbox Code Playgroud)

呼.

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

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

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