通过一个报告用户运行所有 SSRS 报告,忽略自己的用户域

2024-03-16

我有以下代码,它从 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);

然而问题是,当用户选择报告来查看时,它会显示以下错误:

授予用户的权限不足以执行此操作 手术。

我知道对此的快速解决方法是将用户域添加到报表服务器上的安全部分,但是这是不合适的。

我的问题是我可以提供凭据以允许指定用户访问报告文件夹是否可以传递此凭据以便用户可以运行报告?

我的每个报告都使用内置连接字符串NOTWindows 身份验证。

Edit:我正在使用报告 WinForms。


Windows 窗体

在 Windows 窗体项目中,您可以传递合适的System.Net.NetworkCredential https://msdn.microsoft.com/en-us/library/system.net.networkcredential(v=vs.110).aspx to ServerReport.ReportServerCredentials.NetworkCredentials https://msdn.microsoft.com/en-us/library/microsoft.reporting.winforms.reportservercredentials.networkcredentials(v=vs.100).aspx的财产ReportViewer。这样,所有报告都将使用传递的凭据执行:

reportViewer1.ServerReport.ReportServerCredentials.NetworkCredentials =
    new System.Net.NetworkCredential("username", "password", "domain");

网页表格

Web 表单的解决方案有所不同。在 Web 表单项目中,将合适的凭据传递给RePortViewer你需要实施IReportServerCredentials https://msdn.microsoft.com/en-us/library/microsoft.reporting.webforms.ireportservercredentials.aspx。然后您可以将值分配给ServerReport.ReportServerCredentials https://msdn.microsoft.com/en-us/library/microsoft.reporting.webforms.serverreport.reportservercredentials.aspx的财产ReportViewer控制。这样,所有报告都将使用传递的凭据执行。

Example

这是一个简单的实现。最好将用户名、密码和域名存储在应用程序配置中并从配置文件中读取它们:

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;
    }
}

Then in Page_Load通过这种方式传递凭证:

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
        this.ReportViewer1.ServerReport.ReportServerCredentials = 
            new Sample.MyReportServerCredentials();
}

Note

如果您想使用ReportViewer没有会话状态,你也可以实现IReportServerConnection https://msdn.microsoft.com/en-us/library/microsoft.reporting.webforms.ireportserverconnection.aspx。在这种情况下,您需要添加一个键值appsettings配置文件的部分以这种方式介绍实现:

<add key="ReportViewerServerConnection" value="YourNameSpace.YourClass, YourAssemply" />

在这种情况下,您不需要代码Page_Load并且配置就足够了。欲了解更多信息,请查看this https://blogs.msdn.microsoft.com/brianhartman/2008/11/21/custom-credentials-in-the-report-viewer/布莱恩·哈特曼 (Brian Hartman) 撰写的精彩博客文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过一个报告用户运行所有 SSRS 报告,忽略自己的用户域 的相关文章

随机推荐