SSRS 服务器给出 401 Unauthorized 响应,但仅在通过 API 调用时
SSRS server gives a 401 Unauthorised response, but only when called via the APIs
我正在尝试从我的应用程序中的服务器 运行 SSRS 报告,并将结果下载为 PDF。为此,我为服务器上的用户提供了网络凭据,该用户有权访问 运行 报告。
这一切都适用于我本地的 SSRS 开发人员副本,我可以 运行 报告并愉快地继续保存它。但是,当我在服务器上安装 SSRS 运行ning 并将应用程序指向该服务器时,我在尝试 运行 报告时立即收到 401 Unauthorized 错误。
我可以在尝试 运行 应用程序的同一台计算机上通过浏览器访问同一远程服务器,使用在应用程序中失败的相同凭据,并成功 运行有关的报告。 None 的在线可用解决方案似乎 apply/help。
下面是我用来尝试执行报告的代码 - ReportingUsername、ReportingPassword 被设置为可在浏览器中使用的凭据,ReportingDomain 被设置为 PC 的名称,因为它使用本地帐户(这是一个故障排除步骤,我以前没有它也不起作用),设置 PreAuthenticate 是另一个故障排除步骤。 ReportServerUrl 是 http://server/ReportServer(服务器 运行ning 作为端口 80 上的默认实例),JCReportFolder 设置为报告在服务器上所在的文件夹。
ReportKey 只是用于运行 报告的参数。
//setup credentials and URL of report execution service
ReportExecutionService rs = new ReportExecutionService();
NetworkCredential nwk = new System.Net.NetworkCredential(ReportingUsername, ReportingPassword, ReportingDomain);
rs.Credentials = nwk;
rs.PreAuthenticate = true;
rs.Url = ReportServerUrl + "/" + "reportexecution2005.asmx";
rs.ExecutionHeaderValue = new ExecutionHeader();
var executionInfo = new ExecutionInfo();
executionInfo = rs.LoadReport("/" + JCReportFolder + "/" + reportName, null);
//set report key
List<ParameterValue> parameters = new List<ParameterValue>();
parameters.Add(new ParameterValue { Name = "ReportKey", Value = reportKey });
rs.SetExecutionParameters(parameters.ToArray(), "en-US");
string deviceInfo = "<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";
string mimeType;
string encoding;
string[] streamId;
Warning[] warning;
var result = rs.Render("PDF", deviceInfo, out mimeType, out encoding, out encoding, out warning, out streamId);
有人有什么建议吗?目前尝试过:
- 已确认服务器未使用 Kerberos 身份验证,设置为 NTLM
- 正在使用的已检查帐户具有报告的完全权限,并且可以在 Web 浏览器中访问报告(在 运行 通过 C# 代码时从同一台计算机获取 401),甚至尝试将其设置为管理员暂时看看是否有帮助
- 数据库连接使用报表服务器上存储的凭据,而不是提供的凭据,所以这不是问题
- 机器具有通过防火墙的完全访问权限,可以看到 SSRS 机器
确保 .net 使用受支持的 TLS 版本,当 MS 增加 windows 服务器使用的默认 TLS 版本时,我们 运行 陷入看似 运行dom 身份验证问题。
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
经过一番摸索,结果证明这是一个非常荒谬的问题。
原来设置ReportExecutionService.Url出于某种原因清除了ReportExecutionService.Credentials。简单地移动线
rs.Credentials = nwk;
之前
executionInfo = rs.LoadReport("/" + JCReportFolder + "/" + reportName, null);
完全解决了问题。
我的猜测是我没有在本地遇到问题,因为应用程序实际上默认以我的本地管理员帐户执行,因此掩盖了问题。
我正在尝试从我的应用程序中的服务器 运行 SSRS 报告,并将结果下载为 PDF。为此,我为服务器上的用户提供了网络凭据,该用户有权访问 运行 报告。
这一切都适用于我本地的 SSRS 开发人员副本,我可以 运行 报告并愉快地继续保存它。但是,当我在服务器上安装 SSRS 运行ning 并将应用程序指向该服务器时,我在尝试 运行 报告时立即收到 401 Unauthorized 错误。
我可以在尝试 运行 应用程序的同一台计算机上通过浏览器访问同一远程服务器,使用在应用程序中失败的相同凭据,并成功 运行有关的报告。 None 的在线可用解决方案似乎 apply/help。
下面是我用来尝试执行报告的代码 - ReportingUsername、ReportingPassword 被设置为可在浏览器中使用的凭据,ReportingDomain 被设置为 PC 的名称,因为它使用本地帐户(这是一个故障排除步骤,我以前没有它也不起作用),设置 PreAuthenticate 是另一个故障排除步骤。 ReportServerUrl 是 http://server/ReportServer(服务器 运行ning 作为端口 80 上的默认实例),JCReportFolder 设置为报告在服务器上所在的文件夹。
ReportKey 只是用于运行 报告的参数。
//setup credentials and URL of report execution service
ReportExecutionService rs = new ReportExecutionService();
NetworkCredential nwk = new System.Net.NetworkCredential(ReportingUsername, ReportingPassword, ReportingDomain);
rs.Credentials = nwk;
rs.PreAuthenticate = true;
rs.Url = ReportServerUrl + "/" + "reportexecution2005.asmx";
rs.ExecutionHeaderValue = new ExecutionHeader();
var executionInfo = new ExecutionInfo();
executionInfo = rs.LoadReport("/" + JCReportFolder + "/" + reportName, null);
//set report key
List<ParameterValue> parameters = new List<ParameterValue>();
parameters.Add(new ParameterValue { Name = "ReportKey", Value = reportKey });
rs.SetExecutionParameters(parameters.ToArray(), "en-US");
string deviceInfo = "<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";
string mimeType;
string encoding;
string[] streamId;
Warning[] warning;
var result = rs.Render("PDF", deviceInfo, out mimeType, out encoding, out encoding, out warning, out streamId);
有人有什么建议吗?目前尝试过:
- 已确认服务器未使用 Kerberos 身份验证,设置为 NTLM
- 正在使用的已检查帐户具有报告的完全权限,并且可以在 Web 浏览器中访问报告(在 运行 通过 C# 代码时从同一台计算机获取 401),甚至尝试将其设置为管理员暂时看看是否有帮助
- 数据库连接使用报表服务器上存储的凭据,而不是提供的凭据,所以这不是问题
- 机器具有通过防火墙的完全访问权限,可以看到 SSRS 机器
确保 .net 使用受支持的 TLS 版本,当 MS 增加 windows 服务器使用的默认 TLS 版本时,我们 运行 陷入看似 运行dom 身份验证问题。
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
经过一番摸索,结果证明这是一个非常荒谬的问题。
原来设置ReportExecutionService.Url出于某种原因清除了ReportExecutionService.Credentials。简单地移动线
rs.Credentials = nwk;
之前
executionInfo = rs.LoadReport("/" + JCReportFolder + "/" + reportName, null);
完全解决了问题。
我的猜测是我没有在本地遇到问题,因为应用程序实际上默认以我的本地管理员帐户执行,因此掩盖了问题。