3

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);
4

1 に答える 1

9

私はあなたがApacheHTTPClientとHTLMUnitについて話していると仮定していますがあなたが提供したコードのメソッドシグネチャに基づいているので、間違っている場合はお詫びします。

  1. NTLMの場合、これはリモートユーザー名であり、必ずしもローカルホストに現在ログインしているユーザーである必要はありません。これらはあなたのシナリオでは同じユーザーだと思いますが、それを指摘したいと思います。その場合、はい、user.nameシステムプロパティを使用すると、現在ログインしているユーザーの名前が提供されます。

    System.getProperty("user.name");
    

    Windowsでは、USERNAME環境変数を使用することもできます。

    System.getEnv("USERNAME");
    

    com.sun.security.auth.module.NTSystemまたは、クラスを使用できます:

    new NTSystem.getName();
    
  2. You cannot get the user's password. However, you may still be able to perform single signon where the user does not need to provide a password (more on that below.)

  3. The Java mechanism for specifying HTTP proxies is using the http.proxyHost system property:

    String proxyHost = System.getProperty("http.proxyHost");
    

    Note that you should also check the http.nonProxyHosts system property.

    Some JREs (Mac OS comes to mind immediately) will set these system properties based on the system proxy settings. If this is not set by your JRE, you will probably want to try to determine the proxy from another source. On Unix systems, you may wish to use the HTTP_PROXY environment variable. On Windows systems, you're likely best off using the ProxySelector class, as explained in 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/hostnameWindowsでは、COMPUTERNAME環境変数を使用できます。

    System.getEnv("COMPUTERNAME");
    
  6. ローカルマシンが参加しているドメイン名を取得することはできますが、(ユーザーにプロンプ​​トを表示する以外に)認証先のマシンのドメイン名を自動的に取得する方法はありません。もちろん、ローカルワークステーションと認証ターゲットが同じドメインにある場合、これは重要ではありません。USERDOMAINしたがって、Windowsでは、環境変数を使用できます。

    System.getEnv("USERDOMAIN");
    

    NTSystemまたは、クラスを使用できます。

    new NTSystem().getDomain();
    

ふぅ。

「シングルサインオン」の実装について(ユーザーがパスワードを入力する必要がないように):

Java Kerberos機能を使用して(パスワードを必要とせずに)シングルサインオンを実行できる場合がありますが、Javaには明示的なKerberos構成が必要であり(ホストの構成を使用しない)、必要な暗号が実装されていないため、これは失敗しました。 ActiveDirectoryによる。(またはそれは私の理解です。)

また、JNIを使​​用しInitializeSecurityContextて結果のトークンを呼び出してWWW-Authenticateヘッダーに渡すことにより、NTLMまたはSPNEGO(Kerberos)でシングルサインオンを実行することもできます。

于 2012-04-04T21:41:18.613 に答える