簡體   English   中英

axis2 客戶端 NTLM 身份驗證

[英]axis2 client NTLM authentication

我有一個axis2 (v1.5.3) 客戶端,需要使用IIS 進行Kerberos/NTLM 身份驗證。 我怎樣才能做到這一點? 這是我現在擁有的代碼,它失敗並出現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;

AXIS2 中的 NTLM 存在問題。 它以 ntlm.setHost() 方法為中心。 此處的條目既用作 NTLM 交換中的 WORKSTATION,又用作創建 AuthScope 時的遠程主機。 這會導致 NTLM 無法使用 HttpTransportProperties.Authenticator 技術工作的 Catch-22 情況。 您要么得到“401 未授權”,要么得到“未找到 < REALM>@HOST 的憑據”。

請參閱https://issues.apache.org/jira/browse/AXIS2-4595

彼得

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

根據此鏈接上的注釋NTLM 與 Axis2 存在問題

Axis2 仍然使用舊的 HTTPClient 庫,似乎該版本不支持 NTLM 的所有版本(v1、v2)。 而且將傳輸切換到 HTTPClient v4.1 也並非易事

我放棄了 Axis2 並改用CXF

以下鏈接確實讓我們克服了 Kerboros/NTLM 問題

http://download.oracle.com/javase/6/docs/technotes/guides/net/http-auth.html

JCIFS 的替代方法是在自定義 Apache Commons Z293C9EA246FF9985DC6F62A650F789886F62A650F789886F62A650F78988 中使用Apache HTTPComponents 4 NTLMScheme

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

我在 Windows Server 2008 R2 上的 IIS 7.5 上對此進行了測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM