La autorización en Reporting Services

La autorización es el proceso de determinar si se debería conceder a una identidad el tipo solicitado de acceso a un recurso determinado en la base de datos del servidor de informes. Reporting Services utiliza una arquitectura de autorización basada en roles que concede a los usuarios acceso a un recurso determinado según la asignación de roles del usuario para la aplicación. Las extensiones de seguridad para Reporting Services contienen una implementación de un componente de autorización que se utiliza para conceder acceso a los usuarios una vez autenticados en el servidor de informes. La autorización se invoca cuando un usuario intenta realizar una operación en el sistema o en un elemento del servidor de informes a través del acceso de dirección URL y la API SOAP. Esto se posibilita a través de la interfaz de extensión de la seguridad IAuthorizationExtension. Según se ha indicado previamente, todas las extensiones heredan de IExtension la interfaz básica de cualquier extensión que implemente. IExtension e IAuthorizationExtension son miembros del espacio de nombres Microsoft.ReportingServices.Interfaces.

Comprobar el acceso

En la autorización, la clave de cualquier implementación de seguridad personalizada es la comprobación del acceso, que se implementa en el método CheckAccess. Cada vez que un usuario intenta una operación en el servidor de informes, se llama a CheckAccess. El método CheckAccess se sobrecarga para cada tipo de operación. En las operaciones de carpeta, un ejemplo de comprobación de acceso podría ser similar a la siguiente:

// Overload for Folder operations
public bool CheckAccess(
   string userName, 
   IntPtr userToken, 
   byte[] secDesc, 
   FolderOperation requiredOperation)
{
   // If the user is the administrator, allow unrestricted access.
   if (userName == m_adminUserName) 
      return true;

   AceCollection acl = DeserializeAcl(secDesc);
   foreach(AceStruct ace in acl)
   {
         if (userName == ace.PrincipalName)
         {
            foreach(FolderOperation aclOperation in 
               ace.FolderOperations)
            {
               if (aclOperation == requiredOperation)
                     return true;
            }
         }
   }
   return false;
}

El servidor de informes llama al método CheckAccess pasando el nombre del usuario que ha iniciado sesión, un token de usuario, el descriptor de seguridad para el elemento y la operación solicitada. Ahora se comprobaría si el descriptor de seguridad tiene el nombre de usuario y el permiso adecuados para completar la solicitud y, a continuación, se devolvería true para indicar que se concede el acceso o false para indicar que se deniega.

Descriptor de seguridad

Al establecer directivas de autorización en los elementos de la base de datos del servidor de informes, una aplicación cliente (como el Administrador de informes) envía información del usuario a la extensión de seguridad junto con una directiva de seguridad para el elemento. Esta directiva de seguridad e información de usuario se conocen en conjunto como un descriptor de seguridad. Un descriptor de seguridad contiene la información siguiente para un elemento de la base de datos del servidor de informes:

  • El grupo o usuario que tiene algún tipo de permiso para realizar las operaciones en el elemento.

  • El tipo de elemento.

  • Una lista de control de acceso discrecional (DACL) que controla el acceso al elemento.

Los descriptores de seguridad se crean utilizando los métodos SetSystemPolicies y SetPolicies del servicio web.

Flujo de la autorización

La extensión de seguridad configurada actualmente para ejecutarse en el servidor controla la autorización de Reporting Services. La autorización se basa en los roles y está limitada a los permisos y operaciones que proporciona la arquitectura de seguridad de Reporting Services. El diagrama siguiente describe el proceso para autorizar a los usuarios para operar en los elementos de la base de datos del servidor de informes:

Flujo de autorización de seguridad de Reporting Services

Como se muestra en este diagrama, la autorización sigue esta secuencia:

  1. Una vez autenticadas, las aplicaciones cliente realizan las solicitudes al servidor de informes a través de los métodos de servicio web de Reporting Services. Un vale de autenticación se pasa al servidor de informes en forma de una cookie en el encabezado HTTP de cada solicitud web.

  2. La cookie se valida antes de cualquier comprobación de acceso.

  3. Una vez validada la cookie, el servidor de informes llama a GetUserInfo y se proporciona una identidad al usuario.

  4. El usuario intenta una operación a través del servicio web de Reporting Services.

  5. El servidor de informes llama al método CheckAccess.

  6. Se recupera el descriptor de seguridad y se pasa a una implementación de extensión de seguridad personalizada de CheckAccess. En este punto, el usuario, grupo o equipo se comparan con el descriptor de seguridad del elemento al que se va a tener acceso y se les autoriza a realizar la operación solicitada.

  7. Si se autoriza al usuario, el servicio web realiza la operación y devuelve una respuesta a la aplicación que realiza la llamada.