gpt4 book ai didi

c# - 通过忽略自己的用户域的报告用户运行所有 SSRS 报告

转载 作者:太空狗 更新时间:2023-10-30 01:31:35 25 4
gpt4 key购买 nike

我有以下代码从我的 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 窗体项目中,您可以传递合适的 System.Net.NetworkCredentialServerReport.ReportServerCredentials.NetworkCredentials ReportViewer 的属性。这样,所有报告都将使用传递的凭据执行:

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

网络表单

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

示例

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

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

注意

如果您想使用没有 session 状态的ReportViewer,您还可以实现IReportServerConnection .在这种情况下,您需要在配置文件的 appsettings 部分添加一个键值,以这种方式引入实现:

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

在这种情况下,您不需要 Page_Load 中的代码,配置就足够了。有关更多信息,请查看 this Brian Hartman 的精彩博文。

关于c# - 通过忽略自己的用户域的报告用户运行所有 SSRS 报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40682877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com