Pregunta

Quiero poder ver un informe de SQL Server 2005 Reporting Services desde una aplicación ASP.NET en una DMZ a través de un control ReportViewer.El servidor SQL y SSRS están detrás del firewall.

¿Fue útil?

Solución

`Así que tuve que cambiar la forma en que una aplicación ASP.NET 2.0 llama a los informes desde las páginas.Originalmente, usaba JavaScript para abrir una nueva ventana.

ViewCostReport.OnClientClick = "window.open('" + Report.GetProjectCostURL(_PromotionID) + "','ProjectCost','resizable=yes')";

El problema que tuve fue que la llamada window.open solo funcionaría dentro de la red del cliente y no en un nuevo servidor web ubicado en su DMZ.Tuve que crear un nuevo formulario web de informe que incorporara un control ReportViewer para ver los informes.

El otro problema que tuve es que se tuvo que acceder al servidor de informes con autenticación de Windows, ya que otra aplicación lo estaba usando para informes y esa aplicación usaba roles para acceder a los informes.Así que fui a buscar mi control ReportViewer para hacerse pasar por un usuario de Windows.Encontré que la solución es esta:

Cree una nueva clase que implemente la interfaz Microsoft.Reporting.WebForms.IReportServerCredentials para acceder a los informes.

public class ReportCredentials : Microsoft.Reporting.WebForms.IReportServerCredentials
{
    string _userName, _password, _domain;
    public ReportCredentials(string userName, string password, string domain)
    {
        _userName = userName;
        _password = password;
        _domain = domain;
    }

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

    public System.Net.ICredentials NetworkCredentials
    {
        get
        {
            return new System.Net.NetworkCredential(_userName, _password, _domain);
        }
    }

    public bool GetFormsCredentials(out System.Net.Cookie authCoki, out string userName, out string password, out string authority)
    {
        userName = _userName;
        password = _password;
        authority = _domain;
        authCoki = new System.Net.Cookie(".ASPXAUTH", ".ASPXAUTH", "/", "Domain");
        return true;
    }
}

Luego creé un evento para que el botón llamara al informe:

protected void btnReport_Click(object sender, EventArgs e)
{
    ReportParameter[] parm = new ReportParameter[1];
    parm[0] =new ReportParameter("PromotionID",_PromotionID);
    ReportViewer.ShowCredentialPrompts = false;
    ReportViewer.ServerReport.ReportServerCredentials = new ReportCredentials("Username", "Password", "Domain");
    ReportViewer.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
    ReportViewer.ServerReport.ReportServerUrl = new System.Uri("http://ReportServer/ReportServer");
    ReportViewer.ServerReport.ReportPath = "/ReportFolder/ReportName";
    ReportViewer.ServerReport.SetParameters(parm);
    ReportViewer.ServerReport.Refresh();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top