【问题标题】:Running all SSRS reports through one report user ignoring own users domain通过一个报告用户运行所有 SSRS 报告,忽略自己的用户域
【发布时间】:2016-11-18 17:31: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);

但是问题是当用户选择一个报告来查看它时会显示以下错误:

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

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

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

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

编辑:我正在使用 Reporting WinForms。

【问题讨论】:

  • 我认为需要将 ASPNet 用户或 IUser 帐户添加到报表服务器以允许访问。
  • 我在网络凭据中传递的用户已添加到报表服务器上,但未添加尝试连接的用户。

标签: c# winforms reporting-services ssrs-2012


【解决方案1】:

Windows 窗体

在 Windows 窗体项目中,您可以将合适的 System.Net.NetworkCredential 传递给 ServerReport.ReportServerCredentials.NetworkCredentialsReportViewer 属性。这样,所有报告都将使用传递的凭据执行:

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

网络表单

Web 表单的解决方案是不同的。在 Web 窗体项目中,要将合适的凭据传递给 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 中的代码,配置就足够了。如需更多信息,请查看 this Brian Hartman 的精彩博文。

【讨论】:

  • 干杯,我想我明白了,我目前的主要问题是测试它,可能需要一些时间才能设置一个非管理员域帐户才能运行。
  • 没问题,让我知道结果。当报表服务器加入域并且它正常工作时,我从域外的系统对其进行了测试。同样在域中,当登录的域用户没有足够的权限时,因为我们使用MyReportServerCredentials 它可以正常工作。请记住,您用于所有报告的用户/密码应该有权访问报告。
  • 从未加入域的系统进行测试时,请确保清除之前保存在凭据存储中的可能凭据。
  • 我刚刚能够获得一个区域来测试这一点,唯一的区别是我使用的是报告获胜表单而不是 Web 表单,并且 ReportServerCredentials 是只读的
  • 谢谢,虽然根据 msdn 文档它应该有一个 setter msdn.microsoft.com/en-us/library/… 我会更新 dll 看看我是否可以解决它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多