Configurando seguridad desde el ReportViewer

Cuando tenemos listo nuestro informe, tenemos varias formas de visualizarlo. Una de ellas es desde el ReportViewer, el cual tiene dos características para la seguridad, que tendremos que tener en cuenta si queremos que se ejecute nuestro informe. Estas son:  


 

Configuración de la cuenta de usuario. Si queremos acceder a un informe que está en un servidor, al acceder a este siempre nos pide un usuario y password (a menos que tengamos activado recordar contraseña). Cuando lo hacemos desde el ReportViewer, también pasa lo mismo y no queda bien tener que darle al usuario la opción de insertar usuario y password cada vez que ejecute un informe o simplemente que le aparezca un error. Para ello podemos configurarlo desde el ReportViewer en tiempo de ejecución de la siguiente forma:  

reportviewer1.ServerReport.ReportServerCredentials.NetworkCredentials = new System.Net.NetworkCredential(“Usuario”, “passw”,“dominio[esto es opcional]”) 

Para ello, este usuario debe de tener los permisos necesarios para el informe en concreto al que va acceder. Configuración de las datasources de nuestro informe. Cuando pretendemos acceder desde nuestro informe que está alojado en un servidor, a una fuente de datos y no tenemos guardada la contraseña (algo lógico) podemos asignárselas nosotros en tiempo de ejecución desde el ReportViewer una vez cargado este. La forma es la siguiente:  

// Creo una variable de tipo colección de DataSources para asígnarle luego a cada una las credenciales.
ReportDataSourceInfoCollection coleccDS;

// Me traigo las fuente de datos del Visor de Informes.
//Nota: para que me traiga algo, este debe de tener cargado un informe.
coleccDS = this.ReportViewer1.ServerReport.GetDataSources();

if (coleccDS != null)
{
// Paso de credenciales.
DataSourceCredentials cred = new DataSourceCredentials();

for (int i = 0; i < coleccDS.Count; i++)
{
// Nombre de la fuente de datos(DataSource).
cred.Name = coleccDS[ i ].Name.ToString();

// Usuario con la cuenta con la interactuará con el informe.
cred.UserId = this.Usuario

// Password.
cred.Password = this.Password;

// Paso las credenciales al visor de informes.
this. ReportViewer1.ServerReport.SetDataSourceCredentials(new DataSourceCredentials[1] { cred });

}

}
 

Básicamente lo que hago es guardar en una colección, las fuentes de datos y luego a estas les paso el nombre del DataSource, el UserId y el Password. Despues le paso al ReportViewer las credenciales y listo.


 


Espero que os sirva


 


Un Saludo

Sin categoría

16 thoughts on “Configurando seguridad desde el ReportViewer

  1. Hola Fran, he optado por la opción nº1:

    “reportviewer1.ServerReport.ReportServerCredentials = new System.Net.NetworkCredential(“Usuario”, “passw”,”dominio[esto es opcional]”)”

    pero si no me equivoco esta propiedad es de solo lectura, no?

    Gracias.

  2. Hola Cristina,

    Que yo sepa no, cuando accedes a esa propiedad en la ayuda del tooltip dice “Obtiene o Establece”.
    Incluso si te vas a la ayuda te dice lo siguiente:

    C#
    [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)]
    [NotifyParentPropertyAttribute(true)]
    [CategoryAttribute(“Misc”)]
    [BrowsableAttribute(false)]
    public IReportServerCredentials ReportServerCredentials { get; set; }

    Esta última info la saqué de aquí: http://msdn2.microsoft.com/es-es/library/microsoft.reporting.webforms.serverreport.reportservercredentials(VS.80).aspx

    ¿A ti no te va?

    Un Saludo

  3. Perdona Fran por mi “delay” en la respuesta, lo solucioné de la siguiente manera:

    myReport.SmartReportViewer.ServerReport.ReportServerCredentials.NetworkCredentials = New System.Net.NetworkCredential(My.Settings.ReportServerUserName, My.Settings.ReportServerUserPass, My.Settings.ReportServerDomain)

    La verdad es que no te comenté que me encontraba desarrollando aplicación escritorio y no web.
    Muchas Gracias de todas formas. 🙂

  4. mira segui tus paso pero cuando intento levantar el reporte me aparece este error

    reportviewer1.ServerReport.ReportServerCredentials = new System.Net.NetworkCredential(“Usuario”, “passw”,”dominio[esto es opcional]”)

    No se puede convertir un objeto de tipo ‘System.Net.NetworkCredential’ al tipo ‘Microsoft.Reporting.WebForms.IReportServerCredentials’

    ia no entiendo como levantar un report…
    te agradeceria tu ayuda.

  5. Hola Maria,

    Cierto, faltaba poner .NetworkCredential [:$]. Esto quedaría algo así:

    reportViewer1.ServerReport.ReportServerCredentials.NetworkCredentials =
    new System.Net.NetworkCredential(“Usuario”, “passw”, “dominio[esto es opcional]”);

  6. hola mil gracias lo io estoy trabajando con vb pero lo solucione dejando una clase en c# llamada CustomReportCredentials

    CustomReportCredentials irsc = new CustomReportCredentials(“Usuario”, “passw”, “dominio”);
    ReportViewer1.ServerReport.ReportServerUrl = new Uri(“http://servidor/reportserver”);
    ReportViewer1.ServerReport.ReportServerCredentials = irsc;
    ReportViewer1.ServerReport.ReportPath = “Carpeta/”;

    ReportViewer1.ServerReport.Refresh();

    habia probado de la forma que dices pero aun asi no funcionaba bien ia he levantado mi primer reporte
    eeee 😉 feliz gracias por todo e visitado mucho tu blog buscando este tipo de respuestas…

  7. aps si Maria je…. o lixi pa los amigos ja…

    bueno sip grax me funciono pero no como me dijiste si no de la otra forma como te escribi en el post anterior por que de la forma que me decias igual generaba el error… buuu :'(
    pero bien ia ta mi reporte arriba je….

    saludos

  8. Hola Fran Díaz, humildemente solicito de tu apoyo porque tengo un problema con un codigo
    tengo una aplicacion web que etoy desarrollando, estoy utilizando visual studio 2005
    como herramienta de desarrollo y microsoft sql server 2005 donde alojo mi base de datos
    tengo instalado el service pack1 de net2005 y en mi base de datos tengo creado un usuario
    y una contraseña que es la que uso para conectarme a la base de datos y es con la que
    hago mis operacines de acceso a la bd. todo funciona muy bien, pero mi problema esta
    que estoy empezando a usar reportviewer en mi aplicaion web, y mientras ejecuto mi
    aplicacion en el ambiente de desarrollo es decir en mi computadora los reportes funcionan
    muy bien, pero cuando intento ejecutar mi aplicacion fuera del ambiente es decir
    http://localhost/aplicacion/acceso.aspx o en el servidor cuando ya esta montada
    http://000.000.0.000/aplicacion/acceso.aspx
    me aparece un mensaje de error al momento de llegar a la parte de querer generar
    el reporte, el menseje es elsiguiente:
    ——————————-
    Error al procesar el informe.
    Se produjo una excepción en el destino de la invocación.
    Cannot open database “CtrlGesCam” requested by the login. The login failed. Login failed for user ‘SNIASASPNET’.
    ——————————–

    el codigo que uso para llamar a mi reporte es el siguiente:

    Dim FecIni As Date = Request.QueryString(“FecIni”)
    Dim FecFin As Date = Request.QueryString(“FecFin”)
    Dim ta As New DataSet1TableAdapters.viBusSolMunTableAdapter
    Dim dt As New DataSet1.viBusSolMunDataTable
    ta.Fill(dt, FecIni, FecFin)

    ‘creamos el data source del reporte
    Dim rptDataSource As New Microsoft.Reporting.WebForms.ReportDataSource(“DataSet1_viBusSolMun”, dt)
    Me.ReportViewer1.LocalReport.DataSources.Add(rptDataSource)
    Me.ReportViewer1.LocalReport.ReportPath = Server.MapPath(“RepDemPorMun.rdlc”)
    Me.ReportViewer1.LocalReport.Refresh()

    incluso en mi web.config tengo la cadena de conexin a la bd, intente poner el nombre del usuario y la contraseña
    en la cadena de conexion del web.config pero ni asi funciona.

    Te agradeceria eternamente que me enviaras a mi correo una posible solucion ya que de otra forma mis reportes
    los tengo echos en excel y para poder generarlos tengo que poner en el web.config la siguente linea


    y segun tengo entendido eso es para poder escribir en el servidor y es muy arriesgado hacerlo

    Muchas gracias por tu atencion.

    mi correo es danietuz@hotmail.com

  9. Buenos días Fran,
    quisiera preguntarte si sabes si es posible extender el interface de seguridad de reporting services en la versión de sql server 2005 standard edition. Es que estoy creando un servidor de informes y necesito q los usuarios accedan desde el exterior y quisiera dotarle de algunas funcionalidades mediente este interface.
    Muchas gracias de antemano

    un saludo

  10. Hola Fran Díaz!!!

    Otra vez tu servidor solicitando tu valioso apoyo.

    Ya tengo la aplicación en RSS 2005, la seguridad con el servidor de reportes está cubierta con ReportServerCredentials.NetworkCredentials

    Al instalarlo en los equipos de desarrollo todo está de maravilla, pero al llegar con el usuario final, la instalación tiene alguno problemas, pero finalmente se ve la forma, sin embargo al generar el reporte manda el siguiente error:

    Unhandled exception has occurred in your application.
    (…)
    The request failed with http status 407: Proxy Authentication Required

    En la aplicación VB.NET utilizo el ReportViewer de WinForms; enlazo el objeto ServerReport. Anexo código de la función que muestra el reporte:

    Private Sub S_MuestraReporte()
    Dim txtReportServer As String
    Dim txtFolderReport As String
    txtReportServer = “http://nombreservidor/ReportServer”
    txtFolderReport = “/nombrereporte”

    Me.Text = “Generando el reporte…”
    ReportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Remote

    Dim oServerReport As Microsoft.Reporting.WinForms.ServerReport

    oServerReport = ReportViewer1.ServerReport
    oServerReport.ReportServerUrl = New Uri(txtReportServer)
    oServerReport.ReportPath = txtFolderReport
    oServerReport.ReportServerCredentials.NetworkCredentials = New System.Net.NetworkCredential(“usuario”, “password”, “dominio”)

    If txtCita.Text.Length > 0 Then
    Dim oParameter As New Microsoft.Reporting.WinForms.ReportParameter
    oParameter.Name = “nombreparametro”
    oParameter.Values.Add(txtCita.Text)

    Dim oParameters() As Microsoft.Reporting.WinForms.ReportParameter = {oParameter}
    oServerReport.SetParameters(oParameters)
    End If

    ReportViewer1.ShowParameterPrompts = False
    ReportViewer1.Show()
    ReportViewer1.RefreshReport()

    txtCita.SelectionStart = 0
    txtCita.SelectionLength = txtCita.Text.Length
    txtCita.Focus()

    Me.Text = “Listo.”

    End Sub

    Te agradezco de antemano tu ayuda.

    Gracias y saludos.

  11. Hola Fran Diaz!!!

    Solicito tu orientación para ayudarme a salvar el siguiente error

    “The request failed with HTTP status 401: Unauthorized.”

    que aparece exactamente en la línea

    oServerReport.SetParameters(oParameters)

    Lo extraño es que funciona las primeras cuatro o cinco consultas, si son seguidas; pero si me cambio a un browser y regreso de inmediato me manda ese error.

    Para que no creas que soy cómodo con ésto, ya busqué referencias en todos lados de la red, pero o no encuentro la raíz del problema, o no lo veo aunque está enfrente de mi.

    Ojala puedas ayudarme a salvar mi trabajo!!! que ya llevo una semana con ésto y no lo puedo dejar a punto!!!

    Gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *