Java httpclientアナログNTLMドメインログイン


NTLMはNT LAN Managerの略で、マイクロソフトwindowsシステムのログイン認証メカニズムで、ドメイン内のホストの自動認証によく使われています.管理を容易にするために、会社や学校などでは、内部ネットワークに接続されたパソコンにドメインへの加入を要求し、ユーザーのログイン名、パスワードはドメイン内のサーバに保存されます.簡単に言えば、ユーザーがシステムにログインする必要がある場合、サーバーが401を返すにはさらに許可が必要であり、ブラウザとサーバーが協議し、NTLMバージョンなどの内容を確認すると、サーバーはランダムに文字列(チャレンジ、challengeと呼ばれる)を生成し、本機に送り、この機会に本地域に保存されているユーザー名とパスワードを使用して暗号化する.その後、暗号文をサーバに送信し、サーバもユーザーのアカウントとパスワードを使用して暗号化し、2つの暗号文を比較し、一致すればログインに成功します.詳しくはhttp://www.innovation.ch/personal/ronald/ntlm.html 次にhttpclientパッケージを使用して、NTLMログインプロセスをシミュレートするコードを作成します.package com.yeetrack.ntlm;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.NTCredentials;
import org.apache.http.auth.params.AuthPNames;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.params.AuthPolicy;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.conn.params.ConnRouteParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

/**
 * @author youthflies
 * yeetrack.com
 */
public class NtlmTest
{

    public static void main(String[] args)
    {
        DefaultHttpClient httpclient = new DefaultHttpClient();
        List<String> authpref = new ArrayList<String>();
        authpref.add(AuthPolicy.NTLM);
        httpclient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF,    authpref);
        //        、  、   url、     
        NTCredentials creds = new NTCredentials("username", "password",     "serverName", "domain");
        httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds);

        //          、  
        HttpHost target = new HttpHost("serverName", 80, "http");

        // Make sure the same context is used to execute logically related requests
        HttpContext localContext = new BasicHttpContext();

        // Execute a cheap method first. This will trigger NTLM authentication
        HttpGet httpget = new HttpGet("       url:serverName+  +   ");
        //          header  ,      
        httpget.addHeader("Accept-Language", "zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3");
        httpget.addHeader("Accept","image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */*");
        httpget.addHeader("DNT","1");
        httpget.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/6.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729)");
        httpget.addHeader("Accept-Encoding","gzip, deflate");

        try
        {

            HttpResponse response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();
            System.out.println(EntityUtils.toString(entity));
        } catch (ParseException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }   
}  
例はmaven管理を採用し、以下はpom.xmlファイルである.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.yeetrack</groupId>
<artifactId>ntlm</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>ntlm</name>
<url>http://maven.apache.org</url>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3-beta1</version>
    </dependency>
    </dependencies>
</project>