从Java调用时,无法通过NTLM进行身份验证

时间:2012-11-18 20:24:33

标签: java reporting-services ntlm

我正在做教程“Integrate Java with Microsoft SQL Server Reporting Services 2005/2008”。我使用以下设置:

  • SQL Server 2012商业智能
  • Windows 7家庭高级版
  • http client 3.1

在eclipse中执行代码时遇到错误:

  

使用NTLM进行身份验证失败

我已经尝试了this article中提到的JCIFS解决方案,并且看过很多其他帖子,论坛,教程和博客,但问题仍未解决。

对于服务帐户,我使用的是内置帐户:NT Authority\Network Service。我可以通过Web浏览器访问我的Web服务,但不能通过Eclipse访问。

这是输出的完整堆栈:

Nov 19, 2012 3:44:48 AM org.apache.axis.utils.JavaUtils isAttachmentSupported
WARNING: Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
Nov 19, 2012 3:44:49 AM org.apache.commons.httpclient.auth.AuthChallengeProcessor selectAuthScheme
INFO: ntlm authentication scheme selected
Nov 19, 2012 3:44:49 AM org.apache.commons.httpclient.HttpMethodDirector processWWWAuthChallenge
INFO: Failure authenticating with NTLM <any realm>@yappkahowe-pc:80
AxisFault
 faultCode: {http://xml.apache.org/axis/}HTTP
 faultSubcode: 
 faultString: (401)Unauthorized
 faultActor: 
 faultNode: 
 faultDetail: 
    {}:return code:  401

    {http://xml.apache.org/axis/}HttpErrorCode:401

(401)Unauthorized
    at org.apache.axis.transport.http.CommonsHTTPSender.invoke(CommonsHTTPSender.java:218)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceSoapStub.loadReport(ReportExecutionServiceSoapStub.java:886)
    at test.Test.<init>(Test.java:30)
    at test.Test.main(Test.java:70)

我的代码如下:

package test;

import java.net.URL;

import javax.xml.rpc.holders.ByteArrayHolder;
import javax.xml.rpc.holders.StringHolder;
import javax.xml.soap.SOAPException;

import org.apache.axis.EngineConfiguration;
import org.apache.axis.message.SOAPHeaderElement;
import org.apache.commons.httpclient.auth.AuthPolicy;

import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ExecutionInfo;
import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ParameterValue;
import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceLocator;
import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceSoapStub;
import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.holders.ArrayOfStringHolder;
import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.holders.ArrayOfWarningHolder;

public class Test {
    public static final String USERNAME = "NT AUTHORITY\\NETWORKSERVICE";
    public static final String PASSWORD = "";
public Test() {
    AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, JCIFS_NTLMScheme.class);
    ReportExecutionServiceSoapStub service = getService();
    ParameterValue[] parameters = new ParameterValue[0];

    try {
        ExecutionInfo info = service.loadReport("/Tutorial/Members", null); // Load report
        setExecutionId(service, info.getExecutionID()); // You must set the session id before continuing
        service.setExecutionParameters(parameters, "en-us"); // Set report parameters

        String format = "HTML4.0"; // Valid options are HTML4.0, MHTML, EXCEL, CSV, PDF, etc
        String deviceInfo = "<DeviceInfo><Toolbar>False</Toolbar><HTMLFragment>True</HTMLFragment></DeviceInfo>"; // Only generate an HTML fragment
        ByteArrayHolder result = new ByteArrayHolder();
        StringHolder extension = new StringHolder();
        StringHolder mimeType = new StringHolder();
        StringHolder encoding = new StringHolder();
        ArrayOfWarningHolder warnings = new ArrayOfWarningHolder();
        ArrayOfStringHolder streamIDs = new ArrayOfStringHolder();
        service.render(format, deviceInfo, result, extension, mimeType, encoding, warnings, streamIDs); // Render report to HTML

        System.out.println(new String(result.value)); // Prints the report HTML; this could be embedded in a JSP
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] arg) {
    new Test();
}

public static void setExecutionId(ReportExecutionServiceSoapStub service, String id) throws SOAPException {
    SOAPHeaderElement sessionHeader = new SOAPHeaderElement("http://schemas.microsoft.com/sqlserver/2005/06/30/reporting/reportingservices",
            "ExecutionHeader");
    sessionHeader.addChildElement("ExecutionID").addTextNode(id);
    service.setHeader(sessionHeader);
}

public static ReportExecutionServiceSoapStub getService() {
    try {
        String endpoint = "http://127.0.0.1/reportserver/ReportExecution2005.asmx";
        ReportExecutionServiceSoapStub service = (ReportExecutionServiceSoapStub) new ReportExecutionServiceLocator(getEngineConfiguration())
                .getReportExecutionServiceSoap(new URL(endpoint));
        service.setUsername(USERNAME);
        service.setPassword(PASSWORD);
        return service;
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

public static EngineConfiguration getEngineConfiguration() {
    java.lang.StringBuffer sb = new java.lang.StringBuffer();

    sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
    sb.append("<deployment name=\"defaultClientConfig\"\r\n");
    sb.append("xmlns=\"http://xml.apache.org/axis/wsdd/\"\r\n");
    sb.append("xmlns:java=\"http://xml.apache.org/axis/wsdd/providers/java\">\r\n");
    sb.append("<globalConfiguration>\r\n");
    sb.append("<parameter name=\"disablePrettyXML\" value=\"true\"/>\r\n");
    sb.append("<parameter name=\"enableNamespacePrefixOptimization\" value=\"true\"/>\r\n");
    sb.append("</globalConfiguration>\r\n");
    sb.append("<transport name=\"http\" pivot=\"java:org.apache.axis.transport.http.CommonsHTTPSender\"/>\r\n");
    sb.append("<transport name=\"local\" pivot=\"java:org.apache.axis.transport.local.LocalSender\"/>\r\n");
    sb.append("<transport name=\"java\" pivot=\"java:org.apache.axis.transport.java.JavaSender\"/>\r\n");
    sb.append("</deployment>\r\n");

    return new org.apache.axis.configuration.XMLStringProvider(sb.toString());
}

0 个答案:

没有答案