none
ReportViewer con autenticación Windows integrada RRS feed

  • Pregunta

  • Buenos días,

    Estoy desarrollando una aplicación web con VS2010 y uso el control ReportViewer para acceder a un reporte creado con Reporting Services 2008.

    Llevo ya varios días intentando encontrar solución, pero no he dado con ella. Espero que me puedan ayudar.

    Cuando hago la ejecución en localhost funciona y me accede sin problema, pero en cuanto lo pongo en otro servidor me da un error de acceso no autorizado. ("Error de la solicitud con el código de estado HTTP 401: Unauthorized")

    Gracias!

    jueves, 14 de abril de 2011 10:44

Respuestas

  • Si estas haciendo la autenticacion integrada, por alguna via debe de venir los datos del usuario, que no necesariamente tienen que ser los mismos que los datos para autenticarte en el servidor de reportes, si todos tus usuarios tienen el mismo privilegio en los reportes, puedes crear un usuario unico en el servidor y establecerle los permisos al Report Server (no es la mejor opcion, porque no puedes mantener trazas, nunca sabras quien vio el reporte) si por otra parte los usuarios tienen diferentes niveles de permisos sobre los reportes, entonces vas a tener que crear grupos en tu servidor y establecer los permisos, por cada usuario que tiene derecho a ver reportes crearias una cuenta en tu servidor, y lo pones dentro del grupo que definiste para ese tipo de usuario, es un poco enrredado, porque necesitas tener control sobre los usuarios que se autentican en tu sitio y el usuario que este usara para para ver los reportes.

    En mi caso usualmente lo que hago es cuando creo un usuario en mi sitio (o aplicacion), y este necesita ver reportes, le establezco los privilegios luego con un web service le creo un usuario casi identico en el servidor, (con todas las resticciones de seguridad que esto requiere) de esta forma el nunca sabra con que credenciales esta accediendo al servidor y una vez que se autentica en la aplicacion ya tengo tambien los datos necesarios para acceder al report server.

    Mira en el segundo mensaje que te envie, esta la implemantacion de la interfaz  IReportServerCredentials, te sugiero que crees un nuevo Item (en este caso una clase donde implementes la interfaz de la que te hablo), luego la instancias y le pasas los valores de las credenciales para poder acceder a tu Report Server con tu ReportViewer control, en este caso serian del tipo NetWorkCredencials porque estas tratando de acceder a otro servidor, si estubieras dentro de un dominio con la CredentialCache solamente podrias hacerlo, en resumen, lo que estas pasando son los datos necesarios para hacer la autenticacion en el otro servidor, recuerda que Reporting Service utiliza autenticacion windows.

    Espero que te sirva, no dudes en preguntar si no entiendes  algo y por supuesto si encuentras otra forma, solo te pido la compartas.

    Suerte.

    Peter

    miércoles, 20 de abril de 2011 13:49
  • Tanto el servidor web como el de reportes se encuentran en el mismo dominio.

    Deduzco de lo anterior que el servidor web y el de los reports son dos máquinas distintas. En este caso, si quieres que fluya la autenticación integrada desde el pc del usuario al servidor web y que de éste se retransmita al servidor de informes, hay que habilitar este "flujo" a nivel de sistemas. Entre otras cosas, el servidor web tendrá que estar marcado como "trusted for delagation", hay que asignarle un Service Principal Name, y hay que habilitar Kerberos en el dominio.

    Como ves, este tema del "doble-salto" ("double hop") es más complicado de lo que parece, y no se puede resolver solamente con configurar las credenciales a nivel de programación. Hay que reconfigurar bastantes cosas a nivel de infraestructura de sistemas. Cuando la aplicación está en local, en tiempo de desarrollo, no se presentan estos problemas porque no hay doble salto, al tenerlo todo instalado junto en la máquina de desarrollo. Para el paso a producción, si no quieres complicarte la vida con los problemas de infraestructura de sistemas, probablemente tendrás que renunciar a implementar toda la autenticación de forma integrada, y meter un "usuario" y "password" fijos tal como se ha sugerido en algún mensaje anterior.

     

    jueves, 5 de mayo de 2011 8:55
    Moderador

Todas las respuestas

  • Hola Luis,

    Mira necesitas pasarle las credenciales a tu Report Server para que puedas acceder a tus reportes y tambien asegurarte que las credenciales que le estes pasando sirven para ver el reporte que estas tratando de ver,

    Aca te dejo un ejemplo de como lo puedes hacer esta es una via,

           ReportViewerCredentials credentials = new ReportViewerCredentials(Session["user"].ToString(), Session["passw"].ToString(), Session["dominio"].ToString());
           ReportViewer1.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
           ReportViewer1.ServerReport.ReportServerCredentials = credentials;
           ReportViewer1.ServerReport.ReportServerUrl = new Uri("http://omega:8080/reportserver_ws2008");
           ReportViewer1.ServerReport.ReportPath = Request.QueryString["Report"];//aqui deberias de pasar el camino de tu reporte "/carpeta/subcarpeta/reporte" en este caso yo lo paso desde mi URL
           Microsoft.Reporting.WebForms.ReportParameter[] RptParameters = new Microsoft.Reporting.WebForms.ReportParameter[1];
           RptParameters[0] = new Microsoft.Reporting.WebForms.ReportParameter("parametername", "parametervalue");
           ReportViewer1.ServerReport.SetParameters(RptParameters);
           ReportViewer1.ServerReport.Refresh();

    Nota: en este ejemplo le estoy pasando algunos parametros, pero si no te hacen falta puedes solo eliminar esa parte y manten la ultima linea,

    Espero que te ayude.

    Peter

    martes, 19 de abril de 2011 19:36
  • Disculpa que no te haya incluido en la respuesta anterior este pedazo de codigo que te hara falta, No es mas que la implemantecion de la interfaz de IReportServerCredentials;

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Security.Principal;
    using System.DirectoryServices;
    using System.Net;
    using Microsoft.Reporting.WebForms;

    /// <summary>
    /// Summary description for Credentials
    /// </summary>
    public partial class ReportViewerCredentials : IReportServerCredentials
    {
        private string _userName;
        private string _password;
        private string _domain;

        public ReportViewerCredentials(string userName, string password, string domain)
        {
            _userName = userName;
            _password = password;
            _domain = domain;

        }


        public WindowsIdentity ImpersonationUser
        {
            get
            {
                //return null;
                return WindowsIdentity.GetCurrent();
            }
        }

        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 = _userName;
            password = _password;
            authority = _domain;

            // Not using form credentials 
            return false;
        }
      

    }

    martes, 19 de abril de 2011 19:52
  •        ReportViewerCredentials credentials = new ReportViewerCredentials(Session["user"].ToString(), Session["passw"].ToString(), Session["dominio"].ToString());

     

    Hola Peter,

    Gracias por la respuesta. Hoy no me ha dado tiempo a probarlo, pero lo haré el próximo lunes. No obstante al verlo se me plantea una duda.

    Como hago la autenticación integrada en la aplicación web, no tengo en ningún sitio la pass del usuario... siendo así y según el código que me pones me sería imposible pasársela al constructor... ¿cómo hago? ¿me faltaría algo más?

    Un saludo y gracias nuevamente


    miércoles, 20 de abril de 2011 12:53
  • Si estas haciendo la autenticacion integrada, por alguna via debe de venir los datos del usuario, que no necesariamente tienen que ser los mismos que los datos para autenticarte en el servidor de reportes, si todos tus usuarios tienen el mismo privilegio en los reportes, puedes crear un usuario unico en el servidor y establecerle los permisos al Report Server (no es la mejor opcion, porque no puedes mantener trazas, nunca sabras quien vio el reporte) si por otra parte los usuarios tienen diferentes niveles de permisos sobre los reportes, entonces vas a tener que crear grupos en tu servidor y establecer los permisos, por cada usuario que tiene derecho a ver reportes crearias una cuenta en tu servidor, y lo pones dentro del grupo que definiste para ese tipo de usuario, es un poco enrredado, porque necesitas tener control sobre los usuarios que se autentican en tu sitio y el usuario que este usara para para ver los reportes.

    En mi caso usualmente lo que hago es cuando creo un usuario en mi sitio (o aplicacion), y este necesita ver reportes, le establezco los privilegios luego con un web service le creo un usuario casi identico en el servidor, (con todas las resticciones de seguridad que esto requiere) de esta forma el nunca sabra con que credenciales esta accediendo al servidor y una vez que se autentica en la aplicacion ya tengo tambien los datos necesarios para acceder al report server.

    Mira en el segundo mensaje que te envie, esta la implemantacion de la interfaz  IReportServerCredentials, te sugiero que crees un nuevo Item (en este caso una clase donde implementes la interfaz de la que te hablo), luego la instancias y le pasas los valores de las credenciales para poder acceder a tu Report Server con tu ReportViewer control, en este caso serian del tipo NetWorkCredencials porque estas tratando de acceder a otro servidor, si estubieras dentro de un dominio con la CredentialCache solamente podrias hacerlo, en resumen, lo que estas pasando son los datos necesarios para hacer la autenticacion en el otro servidor, recuerda que Reporting Service utiliza autenticacion windows.

    Espero que te sirva, no dudes en preguntar si no entiendes  algo y por supuesto si encuentras otra forma, solo te pido la compartas.

    Suerte.

    Peter

    miércoles, 20 de abril de 2011 13:49
  • Hola Peter,

    Sigo sin ver cómo obtener los datos del usuario autentificado con la seguridad integrada en la web. Sí que conozco el user, pero la pass no la "encuentro" por ningún lado. Hasta ahora siempre habíamos tenido la autentificación básica en la web, con lo cual conocía los dos datos y se los podía pasar al informe sin problema.

    Cada usuario tiene sus permisos dentro de los reportes, pero es ahí donde se controla que se muestra a uno u a otro.

    La cuestión es que si ejecuto en localhost la página me accede sin problema y me muestra el reporte. En cuanto lo pongo en servidor nada sólo consigo el error "Error de la solicitud con el código de estado HTTP 401: Unauthorized".

    Tanto el servidor web como el de reportes se encuentran en el mismo dominio.


    Gracias.

    Luis

    lunes, 25 de abril de 2011 9:11
  • Tanto el servidor web como el de reportes se encuentran en el mismo dominio.

    Deduzco de lo anterior que el servidor web y el de los reports son dos máquinas distintas. En este caso, si quieres que fluya la autenticación integrada desde el pc del usuario al servidor web y que de éste se retransmita al servidor de informes, hay que habilitar este "flujo" a nivel de sistemas. Entre otras cosas, el servidor web tendrá que estar marcado como "trusted for delagation", hay que asignarle un Service Principal Name, y hay que habilitar Kerberos en el dominio.

    Como ves, este tema del "doble-salto" ("double hop") es más complicado de lo que parece, y no se puede resolver solamente con configurar las credenciales a nivel de programación. Hay que reconfigurar bastantes cosas a nivel de infraestructura de sistemas. Cuando la aplicación está en local, en tiempo de desarrollo, no se presentan estos problemas porque no hay doble salto, al tenerlo todo instalado junto en la máquina de desarrollo. Para el paso a producción, si no quieres complicarte la vida con los problemas de infraestructura de sistemas, probablemente tendrás que renunciar a implementar toda la autenticación de forma integrada, y meter un "usuario" y "password" fijos tal como se ha sugerido en algún mensaje anterior.

     

    jueves, 5 de mayo de 2011 8:55
    Moderador
  • Hola, se me presenta el mismo problema,

    paso el usuario, password y servidor de la siguiente manera:

     If Not (Page.IsPostBack) Then

                ReportViewer1.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote

                ReportViewer1.ServerReport.ReportServerUrl = New System.Uri("http://Servidor/ReportServer")

                ReportViewer1.ServerReport.ReportPath = "/Reportes/Rpt"

                ReportViewer1.ShowCredentialPrompts = False

     

               Dim mycred As New ReportServerCredentials("usuario", "password", "servidor")

               ReportViewer1.ServerReport.ReportServerCredentials = mycred

       ReportViewer1.ServerReport.Refresh()

            End If

    __________________________________________________________________________________________

    Todo funciona de maravilla en el localhost, pero al momento de ejecutarlo desde el webserver me marca el error 401 unauthorized

     

    Trabajo en asp.net

    Alguna idea?, ojalá me puedan ayudar

     

    saludos

    jueves, 27 de octubre de 2011 17:51
  • Por favor, revisen las dos pantallas estan en el mismo navegador, cuando me conecto por medio del navegador directamente me funciona correctamente pero cuando me conecto desde el control de ReportViewer, no me aparece nada y lo unico que aparece es un mensaje:

    • Error de la solicitud con el código de estado HTTP 401: Unauthorized.

    Ya he revisado el error pero aun no me aparece :

    Lo [unico seria esto pero desconozco como podria hacerlo:

    Como ves, este tema del "doble-salto" ("double hop") es más complicado de lo que parece, y no se puede resolver solamente con configurar las credenciales a nivel de programación. Hay que reconfigurar bastantes cosas a nivel de infraestructura de sistemas. Cuando la aplicación está en local, en tiempo de desarrollo, no se presentan estos problemas porque no hay doble salto, al tenerlo todo instalado junto en la máquina de desarrollo. Para el paso a producción, si no quieres complicarte la vida con los problemas de infraestructura de sistemas, probablemente tendrás que renunciar a implementar toda la autenticación de forma integrada, y meter un "usuario" y "password" fijos tal como se ha sugerido en algún mensaje anterior. (Tomado de: https://social.msdn.microsoft.com/Forums/es-ES/0d1f9b46-21ec-4722-9215-90878bc723d8/reportviewer-con-autenticacin-windows-integrada?forum=repdeves)

    Tanto el servidor web como el de reportes se encuentran en el mismo dominio.

    Deduzco de lo anterior que el servidor web y el de los reports son dos máquinas distintas. En este caso, si quieres que fluya la autenticación integrada desde el pc del usuario al servidor web y que de éste se retransmita al servidor de informes, hay que habilitar este "flujo" a nivel de sistemas. Entre otras cosas, el servidor web tendrá que estar marcado como "trusted for delagation", hay que asignarle un Service Principal Name, y hay que habilitar Kerberos en el dominio.

    Como ves, este tema del "doble-salto" ("double hop") es más complicado de lo que parece, y no se puede resolver solamente con configurar las credenciales a nivel de programación. Hay que reconfigurar bastantes cosas a nivel de infraestructura de sistemas. Cuando la aplicación está en local, en tiempo de desarrollo, no se presentan estos problemas porque no hay doble salto, al tenerlo todo instalado junto en la máquina de desarrollo. Para el paso a producción, si no quieres complicarte la vida con los problemas de infraestructura de sistemas, probablemente tendrás que renunciar a implementar toda la autenticación de forma integrada, y meter un "usuario" y "password" fijos tal como se ha sugerido en algún mensaje anterior.

     



    Oscar Ortiz Pinzón Microsoft Student Partners - Colombia Asp net|C#|VB .net|Sharepoint Desarrollador Intergrupo S.A http://oscardo.net Bogotá - Colombia

    jueves, 14 de marzo de 2019 13:00
  • ya encontre la solucion, era que tenia mal el nombre de usuario, la clave y el dominio, 

    Gracias!!!


    Oscar Ortiz Pinzón Microsoft Student Partners - Colombia Asp net|C#|VB .net|Sharepoint Desarrollador Intergrupo S.A http://oscardo.net Bogotá - Colombia

    jueves, 14 de marzo de 2019 15:35