访问Reporting Service时的身份验证问题

时间:2013-04-29 17:58:01

标签: asp.net .net-3.5 iis-7.5 reportingservices-2005

好吧,我已经尝试了很多东西来解决这个问题,但没有一个能解决这个问题。

我开发了一个Reporting Service(2005)并部署了它。

这个报告将被访问网站(它是一个互联网站点,因此,不会被内联网访问)的所有人在框架3.5上使用(但我认为框架的版本不是问题的根源)

当用户点击按钮下载报告自动生成的.pdf(最终用户永远不会看到报告的html版本)时,它会要求提供Windows凭据。

如果用户输入有效凭证(并且此凭证必须是部署Reporting Service的服务器上的有效凭据),则显然会下载.pdf。

但这不可能发生。最终用户必须直接下载.pdf,而不需要凭据。毕竟,他甚至没有凭据。

Response.Redirect("http://MyServer/ReportServer/Pages/ReportViewer.aspx?%2fReportLuiza%2fReportContract&rs:Format=PDF&NMB_CONTRACT=" + txtNmbContractReport.Text);

上面的代码段显示了用户点击按钮时代码的第一个版本。这个建议用于Windows凭证。

我已经尝试在IIS上更改虚拟目录ReportServer的身份验证,但唯一有效的是Windows凭据。其他的甚至不让我打开报告的虚拟目录或报告管理器的虚拟目录。

当我尝试将其更改为匿名身份验证时,他无法访问DataBase。然后,我选择安全存储在报表服务器上的凭据选项。仍然无效。

ReportServer虚拟目录的物理目录指向硬盘上的报告服务器文件夹(C:\ Program Files \ Microsoft SQL Server \ MSSQL.5 \ Reporting Services \ ReportServer)。我将同一文件夹移动到我的wwwroot目录。 没工作。虚拟目录甚至没有打开。然后我读到这可能是个问题,因为我在两个文件夹上有相同的名字(一个在C:中,另一个在wwwroot中)。所以我在wwwroot中更改了一个名称。无法完成相同的DataBase连接问题。 我将物理路径返回到C:

下面是我的按钮事件代码的第二个版本:

ReportExecutionService rs = new ReportExecutionService();
        rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
        rs.Url = "http://MyServer/ReportServer/ReportExecution2005.asmx";

        // Render arguments
        byte[] result = null;
        string reportPath = "/ReportLuiza/ReportContract";
        string format = "PDF";

        // Prepare report parameter.
        ParameterValue[] parameters = new ParameterValue[1];
        parameters[0] = new ParameterValue();
        parameters[0].Name = "NMB_CONTRACT";
        parameters[0].Value = txtNmbContractReport.Text;

        string encoding;
        string mimeType;
        string extension;
        Warning[] warnings = null;
        string[] streamIDs = null;

        ExecutionInfo execInfo = new ExecutionInfo();
        ExecutionHeader execHeader = new ExecutionHeader();

        rs.ExecutionHeaderValue = execHeader;

        execInfo = rs.LoadReport(reportPath, null);

        rs.SetExecutionParameters(parameters, "pt-br");
        String SessionId = rs.ExecutionHeaderValue.ExecutionID;

        try
        {
            result = rs.Render(format, null, out extension, out encoding, out mimeType, out warnings, out streamIDs);

            execInfo = rs.GetExecutionInfo();
        }
        catch (SoapException se)
        {
            ShowMessage(se.Detail.OuterXml);
        }

        // Write the contents of the report to an pdf file.
        try
        {
            using (FileStream stream = new FileStream(@"c:\report.pdf", FileMode.Create, FileAccess.ReadWrite))
            {
                stream.Write(result, 0, result.Length);
                stream.Close();
            }
        }
        catch (Exception ex)
        {
            ShowMessage(ex.Message);
        }

对于此代码,我必须将WebReference添加到其中提到的.asmx文件中。

当我调试(在Visual Studio 2010上)时,上面的代码工作正常,不要求凭据(不幸的是,它没有提示打开,保存或取消de文件下载的选项。但这是另一个问题,现在不用担心)并将文件保存在C:。

发布时,代码不起作用。错误说:授予用户'IIS APPPOOL \ ASP.NET v4.0'的权限不足以执行此操作。所以我向Reporting Service的用户添加了这个用户。当我再次尝试时,错误是:用户 IISAPPPOOL \ ASP.NET v4.0 登录失败。无法创建与数据源“MyDataSourceName”的连接。

报告和WebSite都在IIS 7.5版本的同一台服务器上部署/发布。

总结:我需要一个没有凭据提示的解决方案,用户可以选择保存.pdf文件的位置。

任何帮助将不胜感激。

如果您需要更多信息来帮助我,请询问。

提前致谢。

1 个答案:

答案 0 :(得分:1)

一种解决方案是创建一个新的应用程序池,其帐户有权访问您的受限资源,然后将您的Web应用程序分配给它。