Проверка подлинности NTLM клиента axis2 - PullRequest
2 голосов
/ 03 мая 2011

У меня есть клиент axis2 (v1.5.3), которому необходимо выполнить аутентификацию Kerberos / NTLM с IIS. Как я могу это сделать? Это код, который у меня есть сейчас, и он не работает с 401 - unauthorized ошибка:

List<String> authScheme = new ArrayList<String>();
authScheme.add(HttpTransportProperties.Authenticator.NTLM);
HttpTransportProperties.Authenticator ntlm =
                 new HttpTransportProperties.Authenticator();
ntlm.setAuthSchemes(authScheme);
ntlm.setUsername("Administrator");
ntlm.setPassword("password");
ntlm.setHost("http://server/_vti_bin/someservice.asmx");
ntlm.setPort(80);
ntlm.setDomain("server_domain");
Options options = webs._getServiceClient().getOptions();
options.setProperty(HTTPConstants.AUTHENTICATE, ntlm);
stub._getServiceClient().setOptions(options);  

Клиент, написанный на C #, отлично работает с теми же настройками аутентификации:

CredentialCache myCache = new CredentialCache();            
myCache.Add(new Uri(webs.Url), "NTLM", 
            new NetworkCredential("Administrator", "password", "server_domain"));
stub.Credentials = myCache;

Ответы [ 4 ]

3 голосов
/ 26 апреля 2012

Существует проблема с NTLM в AXIS2.Он сосредоточен вокруг метода ntlm.setHost ().Эта запись используется как рабочая станция в обмене NTLM и как удаленный хост при создании AuthScope.Это создает ситуацию Catch-22, где NTLM не работает, используя технику HttpTransportProperties.Authenticator.Вы либо получаете «401 несанкционированный», либо вы получаете «Учетные данные не найдены для @HOST».

См. https://issues.apache.org/jira/browse/AXIS2-4595

Питер

3 голосов
/ 31 августа 2012

HttpClient не поддерживает NTLM v2, поэтому я использую библиотеку JCIFS для возврата типа сообщения NTLM v1,2,3, как описано на этом веб-сайте

http://devsac.blogspot.com/2010/10/supoprt-for-ntlmv2-with-apache.html

Я только что использовал JCIFS_NTLMScheme.javaфайл с сайта выше, чтобы зарегистрировать схему аутентификации, и это сработало !!!!

Пример клиента:

List authSchema = new ArrayList();
AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, org.tempuri.JCIFS_NTLMScheme.class);
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();
auth.setUsername("");
auth.setPassword("");
auth.setDomain("");
auth.setHost("");
auth.setPort();
List authPrefs = new ArrayList(1);
authPrefs.add(AuthPolicy.NTLM);
auth.setAuthSchemes(authPrefs);
stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, auth); 
2 голосов
/ 05 мая 2011

На основе примечаний по этой ссылке Проблемы NTLM с Axis2

Axis2 по-прежнему использует старую библиотеку HTTPClient, и кажется, что версия поддерживает не все версии (v1, v2)NTLM.А также было нетривиально переключить транспорт на HTTPClient v4.1

. Я отказался от Axis2 и вместо этого использовал CXF .

Следующая ссылка действительно помогает нам справиться с проблемами Kerboros / NTLM

http://download.oracle.com/javase/6/docs/technotes/guides/net/http-auth.html
0 голосов
/ 25 июля 2014

Альтернативой JCIFS является использование NTLMScheme Apache HTTPComponents 4 (который работает с новым NTLM ) внутри настраиваемой Apache Commons HTTP AuthScheme:

public class BackportedNTLMScheme extends org.apache.http.impl.auth.NTLMScheme implements org.apache.commons.httpclient.auth.AuthScheme {

    @Override
    public String authenticate(final Credentials credentials, final HttpMethod method) throws AuthenticationException {
        org.apache.commons.httpclient.NTCredentials oldCredentials;
        try {
            oldCredentials = (org.apache.commons.httpclient.NTCredentials) credentials;
        } catch (final ClassCastException e) {
            throw new InvalidCredentialsException(
                    "Credentials cannot be used for NTLM authentication: " 
                    + credentials.getClass().getName());
        }
        final org.apache.http.auth.Credentials adaptedCredentials = new NTCredentials(oldCredentials.getUserName(), oldCredentials.getPassword(), oldCredentials.getHost(), oldCredentials.getDomain());

        try {
            final Header header = super.authenticate(adaptedCredentials, null);
            return header.getValue();
        } catch (final org.apache.http.auth.AuthenticationException e) {
            throw new AuthenticationException("AuthenticationException", e);
        }
    }

    @Override
    public void processChallenge(final String challenge) throws MalformedChallengeException {
        final String s = AuthChallengeParser.extractScheme(challenge);
        if (!s.equalsIgnoreCase(getSchemeName())) {
            throw new MalformedChallengeException("Invalid NTLM challenge: " + challenge);
        }
        int challengeIdx = challenge.indexOf(' ');
        final CharArrayBuffer challengeBuffer;
        if(challengeIdx != -1){
            challengeBuffer = new CharArrayBuffer(challenge.length());
            challengeBuffer.append(challenge);
        } else {
            challengeBuffer = new CharArrayBuffer(0);
            challengeIdx = 0;
        }
        try {
            parseChallenge(challengeBuffer, challengeIdx, challengeBuffer.length());
        } catch (final org.apache.http.auth.MalformedChallengeException e) {
            throw new MalformedChallengeException("MalformedChallengeException", e);
        }
    }

    @Override
    @Deprecated
    public String getID() {
        throw new RuntimeException("deprecated vc.bjn.catalyst.forecast.BackportedNTLMScheme.getID()");
    }


    @Override
    @Deprecated
    public String authenticate(final Credentials credentials, final String method, final String uri) throws AuthenticationException {
        throw new RuntimeException("deprecated vc.bjn.catalyst.forecast.BackportedNTLMScheme.authenticate(Credentials, String, String)");
    }
}

Использование

AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, BackportedNTLMScheme.class);

Я проверял это на IIS 7.5 в Windows Server 2008 R2.

...