将凭据传递给 Sql Report Server 2008

Posted

技术标签:

【中文标题】将凭据传递给 Sql Report Server 2008【英文标题】:Passing Credentials to Sql Report Server 2008 【发布时间】:2009-03-22 22:16:48 【问题描述】:

我是 C# 的新手,我的英语不太好 - 如果我错过了一点,请提前道歉。

我尝试使用ReportService 控件构建一个 ASP.NET 网站。您可能已经知道,s-s-rS 2008 不允许匿名登录。因此,我尝试将凭据传递给 s-s-rS,s-s-rS 将存储在我的网页中,以便用户无需登录即可查看报告。

我找到下面的代码并将其放在我的WebForm 上,但我遇到了报告参数问题。

如果报表参数有默认值,下面的代码 工作正常。

但是,如果我试图改变一个参数的值,整个页面是 刷新,在我点击“查看报告”按钮之前,全部 参数被重置为默认值或空值。

关于如何避免刷新整个页面或将登录信息传递给 s-s-rS 的任何建议?提前非常感谢。

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.htmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Net;
using Microsoft.Reporting.WebForms;

public partial class _Default : System.Web.UI.Page 

    protected void Page_Load(object sender, EventArgs e)
    
        ReportViewer1.Width = 800;
        ReportViewer1.Height = 600;
        ReportViewer1.ProcessingMode = ProcessingMode.Remote;
        IReportServerCredentials irsc =new CustomReportCredentials("administrator", "MYpassworw", "domena");
        ReportViewer1.ServerReport.ReportServerCredentials = irsc;
        ReportViewer1.ServerReport.ReportServerUrl = new Uri("http://192.168.0.1/ReportServer/");
        ReportViewer1.ServerReport.ReportPath = "/autonarudzba/listanarudzbi";
        ReportViewer1.ServerReport.Refresh();
    


public class CustomReportCredentials : IReportServerCredentials

     private string _UserName;
     private string _PassWord;
     private string _DomainName;

     public CustomReportCredentials(string UserName, string PassWord, string DomainName)
     
        _UserName = UserName;
        _PassWord = PassWord;
        _DomainName = DomainName;
     

     public System.Security.Principal.WindowsIdentity ImpersonationUser
      
        get  return null;  
      

     public ICredentials NetworkCredentials
     
        get  return new NetworkCredential(_UserName, _PassWord, _DomainName); 
     

     public bool GetFormsCredentials(out Cookie authCookie, out string user,
      out string password, out string authority)
     
        authCookie = null;
        user = password = authority = null;
        return false;
     

【问题讨论】:

您确定他们从 s-s-rS 2008 中删除了匿名身份验证吗?您可能只需要在 IIS 中配置它? 来自:blogs.msdn.com/jameswu/archive/2008/07/15/… 那么旧的匿名身份验证是 RS 2005 发生了什么?简短的回答是它不再受支持。 【参考方案1】:

我真的没有弄乱 s-s-rS - 但我的 ASP.NET 帽子告诉我,您可能希望将这些东西包装在一个 if (!IsPostBack) 块中,以防止它在页面刷新时运行。我的猜测是ReportViewer1.ServerReport.Refresh() 再次拉取默认值。

protected void Page_Load(object sender, EventArgs e)

    if (!this.IsPostBack) 
    
        ReportViewer1.Width = 800;
        ReportViewer1.Height = 600;
        ReportViewer1.ProcessingMode = ProcessingMode.Remote;
        IReportServerCredentials irsc =new CustomReportCredentials("administrator", "MYpassworw", "domena");
        ReportViewer1.ServerReport.ReportServerCredentials = irsc;
        ReportViewer1.ServerReport.ReportServerUrl = new Uri("http://192.168.0.1/ReportServer/");
        ReportViewer1.ServerReport.ReportPath = "/autonarudzba/listanarudzbi";
        ReportViewer1.ServerReport.Refresh();
    

【讨论】:

我尝试删除行 ReportViewer1.ServerReport.Refresh() 但不幸的是同样的事情又发生了。 您是否将其包装在 IsPostBack 检查中? ReportViewer1.ServerReport.ReportServerCredentials 没有设置器 感谢这个花絮。几个小时以来,我一直对为什么当我传递凭据时报告不会呈现感到困惑。这是天才!【参考方案2】:

我创建了新功能,并在属性、事件、reportViewer 的设计视图中选择了它。 (在选择 INIT i 中)

之后,页面正常工作,我可以更改参数值。

Default.aspx 现在看起来像:

    </head>
      <body>
        <form id="form1" runat="server">
         <div>
            <rsweb:ReportViewer ID="ReportViewer1" runat="server" onload="Admir">
            </rsweb:ReportViewer>
         </div>
       </form>
    </body>

而 Default.aspx.cs 看起来像这样

 public void Admir(object sender, EventArgs e)
    
        ReportViewer1.Width = 800;
        ReportViewer1.Height = 600;
        ReportViewer1.ProcessingMode = ProcessingMode.Remote;
        IReportServerCredentials irsc = new CustomReportCredentials("administrator", "mypass", "domena");
        ReportViewer1.ServerReport.ReportServerCredentials = irsc;
        ReportViewer1.ServerReport.ReportServerUrl = new Uri("http://192.168.0.1/ReportServer/");
        ReportViewer1.ServerReport.ReportPath = "/autonarudzba/listanarudzbi";
        ReportViewer1.ServerReport.Refresh();

    
    protected void Page_Load(object sender, EventArgs e)
    

    

【讨论】:

【参考方案3】:

您可以在页面加载事件中使用以下代码来给参数

ReportParameter[] reportParameterCollection = new ReportParameter[1]; //Array size describes the number of paramaters.
reportParameterCollection[0] = new ReportParameter();
reportParameterCollection[0].Name = "ACCMGR";   //Give Your Parameter Name
reportParameterCollection[0].Values.Add("12"); //Pass Parametrs's value here.
ReportViewer1.ServerReport.SetParameters(reportParameterCollection);
ReportViewer1.ServerReport.Refresh();

我希望这对你有用

【讨论】:

【参考方案4】:

我已经找到了解决方案。 您必须先设置凭据,然后必须为 reportviewer 设置参数。

 rvCommon.ProcessingMode = ProcessingMode.Remote;
        rvCommon.ServerReport.ReportServerUrl = new System.Uri("s-s-rSReportServerURL");
        rvCommon.ServerReport.ReportPath = "/Report Parts/CustomerMainReport2" ;

        Microsoft.Reporting.WebForms.ReportParameter[] RptParameters = new Microsoft.Reporting.WebForms.ReportParameter[1];
         rvCommon.ServerReport.ReportServerCredentials = new ReportCredentials("username", "password", "");

        RptParameters[0] = new Microsoft.Reporting.WebForms.ReportParameter("CustomerId", "1");
        rvCommon.ServerReport.SetParameters(RptParameters);
        rvCommon.ServerReport.Refresh();

【讨论】:

以上是关于将凭据传递给 Sql Report Server 2008的主要内容,如果未能解决你的问题,请参考以下文章

为啥 IIS 中的 Windows/集成身份验证不将用户凭据传递给 s-s-rS 和 SQL?

通过 url 将参数传递给 sql server 报告服务

将参数传递给 SQL Server 中的视图

使用引号将参数传递给 SQL Server SP

将 xml 作为参数传递给 SQL Server 中的存储过程

VBA 将日期参数传递给 SQL Server 存储过程