Autenticación de Windows en Reporting Services

La autenticación es el proceso de establecer el derecho de un usuario en una identidad. Hay muchas técnicas que puede utilizar para autenticar a un usuario. La manera más común es mediante contraseñas. Al implementar la autenticación de formularios, por ejemplo, desea una implementación que consulta a los usuarios las credenciales (normalmente por alguna interfaz que solicita un nombre de inicio de sesión y una contraseña) y, a continuación, valida a los usuarios en un almacén de datos, como una tabla de base de datos o un archivo de configuración. Si no se pueden validar las credenciales, se produce un error en el proceso de autenticación y el usuario asume una identidad anónima.

Autenticación personalizada en Reporting Services

En Reporting Services, el sistema operativo Windows administra la autenticación de los usuarios a través de la seguridad integrada o de la recepción explícita y la validación de las credenciales del usuario. La autenticación personalizada se puede desarrollar en Reporting Services para admitir más esquemas de autenticación. Esta compatibilidad se hace posible a través de la interfaz IAuthenticationExtension2de extensión de seguridad . Todas las extensiones heredan de la interfaz base IExtension para cualquier extensión que implemente y use el servidor de informes. IExtension, y IAuthenticationExtension2, son miembros del Microsoft.ReportingServices.Interfaces espacio de nombres .

Para autenticar con un servidor de informes en Reporting Services, se usa principalmente el método LogonUser. Este miembro del servicio web de Reporting Services se puede utilizar con el objeto de pasar las credenciales del usuario a un servidor de informes para la validación. La extensión de seguridad subyacente implementa IAuthenticationExtension2.LogonUser, que contiene el código de autenticación personalizado. En el ejemplo de autenticación de formularios, LogonUser, que realiza una comprobación de la autenticación contra las credenciales proporcionadas y un almacén de usuario personalizado en una base de datos. Un ejemplo de implementación de LogonUser sería similar a:

public bool LogonUser(string userName, string password, string authority)  
{  
   return AuthenticationUtilities.VerifyPassword(userName, password);  
}  
  

La función de ejemplo siguiente se utiliza para comprobar las credenciales proporcionadas:

  
internal static bool VerifyPassword(string suppliedUserName,  
   string suppliedPassword)  
{   
   bool passwordMatch = false;  
   // Get the salt and pwd from the database based on the user name.  
   // See "How To: Use DPAPI (Machine Store) from ASP.NET," "How To:  
   // Use DPAPI (User Store) from Enterprise Services," and "How To:  
   // Create a DPAPI Library" for more information about how to use  
   // DPAPI to securely store connection strings.  
   SqlConnection conn = new SqlConnection(  
      "Server=localhost;" +   
      "Integrated Security=SSPI;" +  
      "database=UserAccounts");  
   SqlCommand cmd = new SqlCommand("LookupUser", conn);  
   cmd.CommandType = CommandType.StoredProcedure;  
  
   SqlParameter sqlParam = cmd.Parameters.Add("@userName",  
       SqlDbType.VarChar,  
       255);  
   sqlParam.Value = suppliedUserName;  
   try  
   {  
      conn.Open();  
      SqlDataReader reader = cmd.ExecuteReader();  
      reader.Read(); // Advance to the one and only row  
      // Return output parameters from returned data stream  
      string dbPasswordHash = reader.GetString(0);  
      string salt = reader.GetString(1);  
      reader.Close();  
      // Now take the salt and the password entered by the user  
      // and concatenate them together.  
      string passwordAndSalt = String.Concat(suppliedPassword, salt);  
      // Now hash them  
      string hashedPasswordAndSalt =  
         FormsAuthentication.HashPasswordForStoringInConfigFile(  
         passwordAndSalt,  
         "SHA1");  
      // Now verify them. Returns true if they are equal.  
      passwordMatch = hashedPasswordAndSalt.Equals(dbPasswordHash);  
   }  
   catch (Exception ex)  
   {  
       throw new Exception("Exception verifying password. " +  
          ex.Message);  
   }  
   finally  
   {  
       conn.Close();  
   }  
   return passwordMatch;  
}  

Flujo de autenticación

El servicio web de Reporting Services proporciona extensiones de autenticación personalizadas para habilitar la autenticación de formularios del portal web y el servidor de informes.

El método LogonUser del servicio web de Reporting Services se utiliza para enviar las credenciales al servidor de informes para la autenticación. El servicio web usa encabezados HTTP para pasar un vale de autenticación (conocido como "cookie") desde el servidor al cliente para las solicitudes de inicio de sesión validadas.

La ilustración siguiente describe el método para autenticar a los usuarios en el servicio web cuando la aplicación se implementa con un servidor de informes configurado para utilizar una extensión de autenticación personalizada.

Screenshot of the Reporting Services security authentication flow.

Como se muestra en la figura 2, el proceso de autenticación es el siguiente:

  1. Una aplicación cliente llama al método LogonUser del servicio web para autenticar a un usuario.

  2. El servicio web realiza una llamada al método LogonUser de su extensión de seguridad, específicamente, la clase que implementa IAuthenticationExtension2.

  3. La implementación de LogonUser valida el nombre de usuario y la contraseña en el almacén del usuario o la entidad de seguridad.

  4. Tras una autenticación correcta, el servicio web crea una cookie y la administra para la sesión.

  5. El servicio web devuelve el vale de autenticación a la aplicación que realiza la llamada en el encabezado HTTP.

Cuando el servicio web autentica correctamente a un usuario a través de la extensión de seguridad, genera una cookie que se utiliza para las solicitudes subsiguientes. Es posible que la cookie no persista dentro de la entidad de seguridad personalizada porque el servidor de informes no posee la entidad de seguridad. El método del servicio web LogonUser devuelve la cookie y se utiliza en las siguientes llamadas al método de servicio web y en el acceso URL.

Nota

Para evitar poner en peligro la cookie durante la transmisión, las cookies de autenticación que devuelve LogonUser se deberían transmitir protegidas utilizando el cifrado de la Seguridad de la capa de transporte (TLS), conocida anteriormente como Capa de sockets seguros (SSL).

Si tiene acceso al servidor de informes a través del acceso URL cuando se instala una extensión de seguridad personalizada, Internet Information Services (IIS) y ASP.NET administran automáticamente la transmisión del vale de autenticación. Si accede al servidor de informes a través de la API SOAP, la implementación de la clase proxy debe incluir compatibilidad adicional para administrar el vale de autenticación. Para obtener más información sobre cómo utilizar la API SOAP y administrar el vale de autenticación, vea "Usar el servicio web con seguridad personalizada".

Autenticación de formularios

La autenticación de formularios es un tipo de autenticación de ASP.NET en la que un usuario no autenticado se dirige a un formulario HTML. Cuando el usuario proporciona las credenciales, el sistema emite una cookie que contiene un vale de autenticación. En las solicitudes posteriores, el sistema comprueba primero la cookie para ver si el servidor de informes ha autenticado al usuario.

Reporting Services se puede extender para admitir la autenticación de formularios utilizando las interfaces de extensibilidad de seguridad disponibles a través de la API de Reporting Services. Si extiende Reporting Services para utilizar la autenticación de formularios, utilice la Seguridad de la capa de transporte (TLS), conocida anteriormente como Capa de sockets seguros (SSL), para todas las comunicaciones con el servidor de informes, con el fin de evitar que los usuarios malintencionados obtengan acceso a la cookie de otro usuario. TLS permite que los clientes y un servidor de informes se autentiquen entre sí y asegurarse de que ningún otro equipo pueda leer el contenido de las comunicaciones entre los dos equipos. Todos los datos enviados desde un cliente a través de una conexión TLS se cifran para que los usuarios malintencionados no puedan interceptar contraseñas ni datos enviados a un servidor de informes.

La autenticación de formularios se implementa para admitir cuentas y autenticación para plataformas distintas de Windows. Cuando un usuario solicita acceso a un servidor de informes, se presenta una interfaz gráfica y las credenciales proporcionadas se envían a una entidad de seguridad para la autenticación.

La autenticación de formularios requiere que una persona esté presente para escribir las credenciales. En las aplicaciones desatendidas que se comunican directamente con el servicio web de Reporting Services, la autenticación de formularios se debe combinar con un esquema de autenticación personalizada.

La autenticación de formularios es adecuada para Reporting Services cuando:

  • Debe almacenar y autenticar a los usuarios que no tienen cuentas de Microsoft Windows y

  • Debe proporcionar su propio formulario de interfaz de usuario como página de inicio de sesión entre diferentes páginas de un sitio web.

Tenga en cuenta los siguientes puntos al escribir una extensión de seguridad personalizada que admita la autenticación de formularios:

  • Si utiliza la autenticación de formularios, el acceso anónimo debe habilitarse en el directorio virtual del servidor de informes en Internet Information Services (IIS).

  • La autenticación de ASP.NET debe establecerse en la autenticación de formularios. La autenticación de ASP.NET se configura en el archivo Web.config para el servidor de informes.

  • Reporting Services puede autenticar y autorizar a los usuarios con la autenticación de Windows o la autenticación personalizada, pero no con ambos. Reporting Services no admite el uso simultáneo de varias extensiones de seguridad.