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

C# 通过一个报告用户运行所有SSRS报告,忽略自己的用户域,c#,winforms,reporting-services,ssrs-2012,C#,Winforms,Reporting Services,Ssrs 2012,我有下面的代码,它从我的SSRS服务器返回报告,然后我存储每个单独列表的路径,允许用户从应用程序中运行它们。下面的方法很好用 NetworkCredential服务凭据=新的NetworkCredential() { 用户名=用户名, SecurePassword=EncryptionManager.decryptosecurestring(密码), 域=域 }; reports=新的ObservableCollection(reportsManager.FindReports(reportsW

我有下面的代码,它从我的SSRS服务器返回报告,然后我存储每个单独列表的路径,允许用户从应用程序中运行它们。下面的方法很好用

NetworkCredential服务凭据=新的NetworkCredential()
{
用户名=用户名,
SecurePassword=EncryptionManager.decryptosecurestring(密码),
域=域
};
reports=新的ObservableCollection(reportsManager.FindReports(reportsWebService、reportsFolderName、serviceCredentials));
//金融报告
ReportingService2005 rs=新的ReportingService2005();
rs.Url=reportsWebService;
rs.凭证=服务凭证;
CatalogItem[]catalogItems=rs.ListChildren(@“/”+reportsFolderName,false);
但是,问题是,当用户选择要查看的报表时,它会显示以下错误:

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

我知道快速修复方法是将用户域添加到报表服务器的安全部分,但这并不合适

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

我的每个报告都使用内置连接字符串而不是windows身份验证

编辑:我正在使用WinForms报表。

Windows窗体 在windows窗体项目中,可以将适当的属性传递给
ReportViewer
。这样,所有报告都将使用传递的凭据执行:

reportViewer1.ServerReport.ReportServerCredentials.NetworkCredentials =
    new System.Net.NetworkCredential("username", "password", "domain");
网络表单 Web表单的解决方案是不同的。在Web表单项目中,要将合适的凭证传递给
RePortViewer
,您需要实现。然后,您可以将值分配给
ReportViewer
控件的属性。这样,所有报告都将使用传递的凭证执行

示例

下面是一个简单的实现。最好将用户名、密码和域名存储在app config中,并从配置文件中读取它们:

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\u Load
中,通过以下方式传递凭证:

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
        this.ReportViewer1.ServerReport.ReportServerCredentials = 
            new Sample.MyReportServerCredentials();
}
<add key="ReportViewerServerConnection" value="YourNameSpace.YourClass, YourAssemply" />
注意

如果要在没有会话状态的情况下使用
ReportViewer
,也可以实现。在这种情况下,您需要在配置文件的
appsettings
部分添加一个键值,以这种方式介绍实现:

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
        this.ReportViewer1.ServerReport.ReportServerCredentials = 
            new Sample.MyReportServerCredentials();
}
<add key="ReportViewerServerConnection" value="YourNameSpace.YourClass, YourAssemply" />

Brian Hartman的精彩博文。

我认为需要将ASPNet用户或IUser帐户添加到报表服务器以允许访问。我在网络凭据中传递的用户添加到报表服务器上,但尝试连接的用户没有添加。干杯,我想我明白了,我目前的主要问题是测试它,可能需要一些时间才能设置一个非管理员域帐户来运行。没问题,让我知道结果。当报表服务器加入域中时,我从域外的系统对其进行了测试,并且工作正常。当登录的域用户没有足够的权限时,也在域中,因为我们使用
MyReportServerCredentials
它工作正常。请记住,您用于所有报告的用户/密码都应该可以访问报告。当从未加入域的系统进行测试时,请确保清除以前保存在凭据存储中的可能凭据。我刚刚能够获得一个区域来测试这一点,唯一的区别是我使用的是Reporting win forms,而不是web forms,ReportServerCredentials是只读的,尽管根据msdn文档,它应该有一个setter,我将更新dll,看看是否可以解决它:)