gpt4 book ai didi

asp.net - SSRS 报告查看器 + ASP.NET 凭据 401 异常

转载 作者:行者123 更新时间:2023-12-02 17:17:03 24 4
gpt4 key购买 nike

我在 SQL2005 报告服务器上保存了一份报告,并且我想返回该报告的渲染 PDF。我在使用本地 *.rdlc 文件 ( and I've blogged about it ) 时已经弄清楚了这一点,但当 *.rdl 驻留在报告服务器上时却没有。我在线路上收到 401 Not Authorized 错误...

reportViewer.ServerReport.SetParameters(reportDefinition.ReportParameters);

这是用于呈现报告的方法。

public byte[] Render(IReportDefinition reportDefinition)
{
var reportViewer = new ReportViewer();
byte[] renderedReport;
try
{
var credentials = new WindowsImpersonationCredentials();
reportViewer.ServerReport.ReportServerUrl = new Uri("http://myssrsbox", UrlKind.Absolute);
reportViewer.ServerReport.ReportServerCredentials = credentials;
reportViewer.ServerReport.ReportPath = reportDefinition.Path;
// Exception is thrown on the following line...
reportViewer.ServerReport.SetParameters(reportDefinition.ReportParameters);

string mimeType;
string encoding;
string filenameExtension;
string[] streams;
Warning[] warnings;

renderedReport = reportViewer.ServerReport.Render(reportDefinition.OutputType, reportDefinition.DeviceInfo, out mimeType, out encoding, out filenameExtension, out streams, out warnings);
}
catch (Exception ex)
{
// log the error...
throw;
}
finally
{
reportViewer.Dispose();
}
return renderedReport;
}

您缺少的另一件事是 WindowsImpersonationCredentials 类。

public class WindowsImpersonationCredentials : IReportServerCredentials
{
public bool GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority)
{
authCookie = null;
userName = password = authority = null;
return false;
}

public WindowsIdentity ImpersonationUser
{
get { return WindowsIdentity.GetCurrent(); }
}

public ICredentials NetworkCredentials
{
get { return null; }
}

public override string ToString()
{
return String.Format("WindowsIdentity: {0} ({1})", this.ImpersonationUser.Name, this.ImpersonationUser.User.Value);
}
}

您可能需要了解的其他事项...

  • 它正在 Intranet 上运行,并且模拟已打开。
  • 日志记录表明模拟用户设置正确。
  • 在 Visual Studio (http://localhost:devport) 中运行时确实有效,并且在我的计算机上运行时确实有效开发框(http://localhost/myApplication)。在我们的测试或生产服务器上运行时,它不起作用
  • 我尝试过在 web.config 中使用和不使用 system.net.defaultProxy 设置的解决方案。两者都不起作用。

我做错了什么?是服务器设置吗?是代码吗?是 web.config 吗?

最佳答案

我们终于解决了问题。我们的网络管理员已禁用双跳,因此虽然模拟已正确连接为 domain\jmeyer,但应用程序仍在尝试使用 domain\web01$ 连接到 SRS 框>。为什么要这样设置呢?因为双跳是一个巨大的安全漏洞。 (至少有人告诉我。这听起来像你会在 The Daily WTF 上读到的东西吗?)

我们的解决方案是创建一个通用 domain\ssrs_report_services 用户,并使用以下网络凭据与该用户连接

public class CustomCredentials : IReportServerCredentials
{
public bool GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority)
{
authCookie = null;
userName = password = authority = null;
return false;
}

public WindowsIdentity ImpersonationUser
{
get { return null; }
}

public ICredentials NetworkCredentials
{
get { return new NetworkCredential("ssrs_report_services", "password", "domain") ; }
}
}

以上是您可以在互联网上找到的经典示例解决方案。

关于asp.net - SSRS 报告查看器 + ASP.NET 凭据 401 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1439245/

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