gpt4 book ai didi

java - HttpURLConnection 采用登录用户而不是使用提供的凭据来连接 Web 服务

转载 作者:太空宇宙 更新时间:2023-11-04 12:55:44 26 4
gpt4 key购买 nike

我创建了一个 Java 应用程序来连接 IIS 7 (Windows Server 2008 R2) 中托管的 ASP.Net Asmx Web 服务。托管站点配置为 Windows 身份验证的身份验证类型,提供商为协商和 ntlm

在Java代码中,我使用Authenticator类来设置用户名和密码。如果我输入的密码错误,此代码将连接到 Web 服务事件。我检查了IIS日志,它实际上使用当前登录的用户来连接Web服务。

我在调用getPasswordAuthentication()函数后尝试调试Java代码,java代码使用krb5身份验证方法验证用户名和密码。此时会抛出异常

"Unable to locate Kerberos realm"

但是这个异常是在 java api 中处理的,我正在从 Web 服务获取响应

我们的要求是,如果提供的凭据错误,则使用提供的凭据连接 Web 服务。它应该返回未经授权的访问代码。

下面是我的java代码。

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import org.apache.commons.codec.binary.Base64;

public class ConnectToUrlUsingBasicAuthentication {

public static void main(String[] args) {

try {
String webPage = "http://servername/webservice/ABC.asmx/GetStudentReport";
String name = "domain.lab\\sachin";
String password = "Password123";

//NtlmHandler handler = new NtlmHandler();

Authenticator.setDefault(new NtlmAuthenticator(name, password));

String authString = name + ":" + password;
System.out.println("auth string: " + authString);
byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
String authStringEnc = new String(authEncBytes);
System.out.println("Base64 encoded auth string: " + authStringEnc);

URL url = new URL(webPage);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//conn.setRequestProperty("Authorization", "Basic " +authStringEnc );
conn.connect();

System.out.println("Response Code: " + conn.getResponseCode() );

URLConnection urlConnection = url.openConnection();
urlConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
InputStream is = urlConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);

int numCharsRead;
char[] charArray = new char[1024];
StringBuffer sb = new StringBuffer();
while ((numCharsRead = isr.read(charArray)) > 0) {
sb.append(charArray, 0, numCharsRead);
}
String result = sb.toString();

System.out.println("*** BEGIN ***");
System.out.println(result);
System.out.println("*** END ***");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}

下面是 NtlmAuthenticator 类

import java.net.Authenticator;
import java.net.PasswordAuthentication;

public class NtlmAuthenticator extends Authenticator {

private final String username;
private final char[] password;

public NtlmAuthenticator(final String username, final String password) {
super();
this.username = new String(username);
this.password = password.toCharArray();
}

@Override
public PasswordAuthentication getPasswordAuthentication() {
System.out.println("Scheme:" + getRequestingScheme() );
System.out.println("Host:" + getRequestingHost() );
PasswordAuthentication pa = new PasswordAuthentication(username, password);
System.out.println("UserName:" + pa.getUserName() );
System.out.println("Password:" + pa.getPassword().toString() );
return pa;

}
}

请提前提供建议,谢谢。

最佳答案

如果您在 Windows 上运行客户端,则此行为是指定的。身份验证过程将首先尝试使用登录用户的凭据。

这是在 http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-auth.html 中的 NTLM 部分下指定的:“在 Microsoft Windows 平台上,NTLM 身份验证尝试从系统获取用户凭据,而不提示用户的身份 validator 对象”。

关于java - HttpURLConnection 采用登录用户而不是使用提供的凭据来连接 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35409285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com