Autorização no Reporting Services

A autorização é o processo que determina se uma identidade deve receber o tipo de acesso solicitado para um determinado recurso do banco de dados do servidor de relatório. O Reporting Services usa uma arquitetura baseada em função que concede ao usuário o acesso a um determinado recurso com base na atribuição de função do usuário para o aplicativo. As extensões de segurança para o Reporting Services contêm uma implementação de um componente de autorização usado para conceder acesso a usuários assim que eles se autenticam no servidor de relatório. A autorização é invocada quando um usuário tenta executar uma operação no sistema ou um item de servidor de relatório por meio da API SOAP e via acesso à URL. Isso é possível por meio da interface de extensão de segurança IAuthorizationExtension. Como foi dito anteriormente, todas as extensões herdam de IExtension, a interface base para qualquer extensão que você implanta. IExtension e IAuthorizationExtension são os membros do namespace Microsoft.ReportingServices.Interfaces.

Verificando o acesso

Na autorização, a chave para qualquer implementação de segurança personalizada é a verificação de acesso, implementada pelo método CheckAccess. CheckAccess será chamado sempre que um usuário tentar executar uma operação no servidor de relatório. O método CheckAccess é sobrecarregado para cada tipo de operação. Para operações de pasta, um exemplo de uma verificação de acesso poderia ficar assim:

// 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;
}

O servidor de relatório chama o método CheckAccess passando o nome do usuário conectado, um token de usuário, o descritor de segurança para o item e a operação solicitada. Aqui você poderia verificar o descritor de segurança para o nome de usuário e a permissão apropriada para concluir a solicitação, retornar true para mostrar que o acesso foi concedido ou false para mostrar que o acesso foi negado.

Descritores de segurança

Ao definir políticas de autorização em itens do banco de dados do servidor de relatório, um aplicativo cliente (como o Gerenciador de Relatórios) envia as informações do usuário na extensão de segurança junto com a política de segurança do item. Essa política de segurança e as informações do usuário são conhecidas coletivamente como um descritor de segurança. Um descritor de segurança contém as seguintes informações para um item no banco de dados do servidor de relatório:

  • O grupo ou o usuário com algum tipo de permissão para executar operações no item.

  • O tipo do item.

  • Uma lista de controle de acesso discricionário que controla acesso ao item.

Os descritores de segurança são criados por meio do serviço Web SetPolicies e dos métodos SetSystemPolicies.

Fluxo de autorização

A autorização do Reporting Services é controlada pela extensão de segurança configurada para ser executada atualmente no servidor. A autorização é baseada em função e está limitada às permissões e operações fornecidas pela arquitetura de segurança do Reporting Services. O diagrama a seguir descreve o processo de autorização de usuários a operar em itens no banco de dados do servidor de relatório:

Fluxo de autorização de segurança do Reporting Services

Como mostrado neste diagrama, a autorização segue esta sequência:

  1. Uma vez autenticados, os aplicativos cliente fazem solicitações ao servidor de relatório por meio dos métodos do serviço Web Servidor de Relatório. Um tíquete de autenticação é passado ao servidor de relatório na forma de um cookie no cabeçalho HTTP de cada solicitação Web.

  2. O cookie é validado antes de qualquer verificação de acesso.

  3. Após a validação do cookie, o servidor de relatório chama GetUserInfo e o usuário recebe uma identidade.

  4. O usuário tenta executar uma operação por meio do serviço Web Reporting Services.

  5. O servidor de relatório chama o método CheckAccess.

  6. O descritor de segurança é recuperado e passado a uma implementação de extensão de segurança personalizada de CheckAccess. Neste ponto, o usuário, grupo ou computador é comparado ao descritor de segurança do item acessado e é autorizado a executar a operação solicitada.

  7. Se o usuário for autorizado, o serviço Web executará a operação e devolverá uma resposta ao aplicativo de chamada.