通过一个报表用户运行所有SSRS报表,忽略自己的用户域
本文关键字:报表 用户 SSRS 自己的 运行 一个 | 更新日期: 2023-09-27 18:18:34
我有以下代码,它从我的SSRS服务器返回报告,然后我存储每个单独列表的路径,允许用户在应用程序中运行它们。
NetworkCredential serviceCredentials = new NetworkCredential()
{
UserName = username,
SecurePassword = EncryptionManager.DecryptToSecureString(password),
Domain = domain
};
reports = new ObservableCollection<object>(reportsManager.FindReports(reportsWebService, reportsFolderName, serviceCredentials));
//FindReports
ReportingService2005 rs = new ReportingService2005();
rs.Url = reportsWebService;
rs.Credentials = serviceCredentials;
CatalogItem[] catalogItems = rs.ListChildren(@"/" + reportsFolderName, false);
然而,问题是当用户选择要查看的报告时,它显示以下错误:
授予user的权限不足以执行此操作操作。
我理解这个问题的快速解决办法是将users域添加到报表服务器的安全部分,但是这是不合适的。
我的问题是,我可以提供凭据,以允许指定用户访问报告文件夹,是否有可能将其传递下去,以便用户可以运行报告?
我的每个报告都使用内置的连接字符串NOT windows身份验证。
编辑:我正在使用报告WinForms
Windows窗体
在windows窗体项目中,您可以传递ReportViewer
的合适的System.Net.NetworkCredential
到ServerReport.ReportServerCredentials.NetworkCredentials
属性。这样,将使用传递的凭据执行所有报告:
reportViewer1.ServerReport.ReportServerCredentials.NetworkCredentials =
new System.Net.NetworkCredential("username", "password", "domain");
Web表单
Web表单的解决方案是不同的。在Web Forms项目中,要将合适的凭据传递给RePortViewer
,需要实现IReportServerCredentials
。然后,您可以将值分配给ReportViewer
控件的ServerReport.ReportServerCredentials
属性。这样,将使用传递的凭据执行所有报告。
这是一个简单的实现。最好将用户名,密码和域名存储在应用配置中,并从配置文件中读取它们:
using System;
using System.Net;
using System.Security.Principal;
using Microsoft.Reporting.WebForms;
[Serializable]
public sealed class MyReportServerCredentials : IReportServerCredentials
{
public WindowsIdentity ImpersonationUser { get { return null; } }
public ICredentials NetworkCredentials
{
get
{
return new NetworkCredential("username", "password", "domain");
}
}
public bool GetFormsCredentials(out Cookie authCookie, out string userName,
out string password, out string authority)
{
authCookie = null;
userName = password = authority = null;
return false;
}
}
然后在Page_Load
中这样传递凭据:
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
this.ReportViewer1.ServerReport.ReportServerCredentials =
new Sample.MyReportServerCredentials();
}
注意
如果你想使用ReportViewer
而没有会话状态,你也可以实现IReportServerConnection
。在这种情况下,您需要在配置文件的appsettings
部分添加一个键值,以这种方式引入实现:
<add key="ReportViewerServerConnection" value="YourNameSpace.YourClass, YourAssemply" />
在这种情况下,您不需要Page_Load
中的代码,配置就足够了。要了解更多信息,请查看Brian Hartman的这篇博文。