首页 > 解决方案 > 使用由 WindowsAuthentication 保护的 IIS 上托管的 WebService 的 Java 问题

问题描述

应用说明

行为不当的APP是一个Android APP,它允许用户从手机中拍照,然后上传到Sharepoint CMS。

详细问题描述

在 Java 应用程序上,我正在向 IIS 上托管的 SOAP WebService 发送一个包含图像字节的 POST HTTP 请求作为 base64。此 WebService 使用 Windows 身份验证进行保护。我已将 Java 程序配置为在发出请求时发送凭据。当我检查 HTTP 响应代码时,它是HTTP 401 Unauthorized。我无法检查响应内容。

注意事项

Java 调试器没有按应有的方式进入Authenticator类的getPasswordAuthentication方法。

应用规格

相关代码

连接设置

URL url = new URL(ENDPOINT_URL);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
// Enable POST
httpURLConnection.setDoOutput(true);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Content-Type", "text/xml");

身份验证器设置始终发送存储的凭据

Authenticator.setDefault(new NTLMAuthenticator());

NTLMAuthenticator 类

public class NTLMAuthenticator extends Authenticator {
    @Override
    public PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("USER_NAME", "PASSWORD".toCharArray());
    }
}

请求 POST 内容设置

try (OutputStream outputStream = httpURLConnection.getOutputStream()) {
    String baseRequest = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><soap:Body><Upload xmlns=\"http://schemas.microsoft.com/sharepoint/soap/ois/\"><strListName>%s</strListName><strFolder /><bytes>%s</bytes><fileName>%s</fileName><fOverWriteIfExist>true</fOverWriteIfExist></Upload></soap:Body></soap:Envelope>";
    File f = new File(PATH_TO_FILE);
    byte[] fileBytes = FileUtils.readFileToByteArray(f);
    String fileBase64 = android.util.Base64.encodeToString(fileBytes, 0);
    outputStream.write(String.format(baseRequest, LIST_NAME, fileBase64, FILE_NAME).getBytes());
    outputStream.flush();
} catch (Exception e) {
    e.printStackTrace();
}

响应读取

int response_code = httpURLConnection.getResponseCode();
if (response_code == HttpURLConnection.HTTP_OK) {
    // **response_code IS HTTP_UNAUTHORIZED**
    try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()))) {
        // **Unreachable code**
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            // Read response line by line
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

标签: javaweb-servicesiisntlm-authentication

解决方案


推荐阅读