ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-06-27 22:02:00  阅读:197  来源: 互联网

标签:c winforms reporting-services ssrs-2012


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

但问题是,当用户选择要查看的报告时,会显示以下错误:

The permissions granted to user are insufficient for performing this
operation.

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

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

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

编辑:我正在使用Reporting WinForms.

解决方法:

Windows窗体

在Windows窗体项目中,您可以传递ReportViewer的合适的System.Net.NetworkCredentialServerReport.ReportServerCredentials.NetworkCredentials属性.这样,所有报告都将使用传递的凭证执行:

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

Web表单

Web窗体的解决方案是不同的.在Web窗体项目中,要将合适的凭据传递给RePortViewer,您需要实现IReportServerCredentials.然后,您可以将值分配给ReportViewer控件的ServerReport.ReportServerCredentials属性.这样,所有报告都将使用传递的凭证执行.

这是一个简单的实现.最好在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_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撰写的this精彩博文.

标签:c,winforms,reporting-services,ssrs-2012
来源: https://codeday.me/bug/20190627/1309218.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有