Autenticação no Reporting Services

A autenticação é o processo de estabelecimento do direito de um usuário a uma identidade. Existem muitas técnicas que você pode usar para autenticar um usuário. O modo mais comum é usar senhas. Ao implementar a Autenticação de Formulários, por exemplo, você deseja uma implementação que consulte os usuários em busca de credenciais (geralmente por alguma interface que solicite um nome de entrada e senha) e, em seguida, valide os usuários em relação a um armazenamento de dados, como uma tabela de banco de dados ou um arquivo de configuração. Se as credenciais não puderem ser validadas, o processo de autenticação falhará e o usuário assumirá uma identidade anônima.

Autenticação personalizada no Reporting Services

No Reporting Services, o sistema operacional Windows lida com a autenticação de usuários por meio da segurança integrada ou da recepção explícita e da validação de credenciais de usuário. A autenticação personalizada pode ser desenvolvida no Reporting Services para oferecer suporte a mais esquemas de autenticação. Este suporte é possível através da interface IAuthenticationExtension2de extensão de segurança . Todas as extensões herdam da interface base IExtension para qualquer extensão implantada e usada pelo servidor de relatório. IExtensionIAuthenticationExtension2e , são membros do Microsoft.ReportingServices.Interfaces namespace.

A principal forma de autenticar em um servidor de relatório no Reporting Services é o método LogonUser. Esse membro do serviço Web Reporting Services pode ser usado para passar credenciais de usuário a um servidor de relatório para validação. A extensão de segurança subjacente implementa IAuthenticationExtension2.LogonUser, que contém o código de autenticação personalizado. Na amostra da Autenticação de Formulários, LogonUser, que executa uma verificação de autenticação nas credenciais fornecidas e em um repositório de usuários personalizado de um banco de dados. Um exemplo de implementação de LogonUser é semelhante a esta:

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

A função de exemplo a seguir é usada para verificar as credenciais fornecidas:

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

Fluxo de autenticação

O serviço Web Reporting Services oferece extensões de autenticação personalizadas para habilitar a Autenticação de Formulários pelo portal da Web e pelo servidor de relatório.

O método LogonUser do serviço Web Reporting Services é usado para enviar credenciais ao servidor de relatório para autenticação. O serviço Web usa cabeçalhos HTTP para passar um tíquete de autenticação (conhecido como "cookie") do servidor para o cliente para solicitações de entrada validadas.

A ilustração a seguir mostra o método de autenticação de usuários no serviço Web quando o seu aplicativo é implantado com um servidor de relatório configurado para usar uma extensão de autenticação personalizada.

Screenshot of the Reporting Services security authentication flow.

Como mostrado na Figura 2, o processo de autenticação é assim:

  1. Um aplicativo cliente chama o método do serviço Web LogonUser para autenticar um usuário.

  2. O serviço Web faz uma chamada ao método LogonUser de sua extensão de segurança, especificamente, a classe que implementa IAuthenticationExtension2.

  3. A sua implementação de LogonUser valida o nome de usuário e a senha no repositório de usuários ou na autoridade de segurança.

  4. Após a autenticação bem-sucedida, o serviço Web criará um cookie e o gerenciará para a sessão.

  5. O serviço Web devolve o tíquete de autenticação ao aplicativo de chamada no cabeçalho HTTP.

Quando o serviço Web autenticar um usuário com êxito por meio da extensão de segurança, vai gerar um cookie que será usado para as solicitações subsequentes. O cookie pode não persistir na autoridade de segurança personalizada porque o servidor de relatório não possui a autoridade de segurança. O cookie é retornado a partir do método LogonUser do serviço Web e é usado em chamadas subsequentes do método do serviço Web e no acesso à URL.

Observação

Para impedir o comprometimento do cookie durante a transmissão, os cookies de autenticação retornados de LogonUser devem ser transmitidos de forma segura usando criptografia TLS (Transport Layer Security), anteriormente conhecida como SSL (Secure Sockets Layer).

Se você acessar o servidor de relatório por meio do acesso à URL quando uma extensão de segurança personalizada for instalada, os IIS (Serviços de Informações da Internet) e o ASP.NET gerenciarão automaticamente a transmissão do tíquete de autenticação. Se você estiver acessando o servidor de relatório por meio da API SOAP, sua implementação da classe proxy deverá incluir suporte extra para gerenciar o tíquete de autenticação. Para obter mais informações sobre como usar a API SOAP e gerenciar o tíquete de autenticação, consulte "Usando o serviço Web com segurança personalizada".

Autenticação de Formulários

A Autenticação de Formulários é um tipo de autenticação do ASP.NET em que um usuário não autenticado é direcionado a um formulário HTML. Quando o usuário fornece credenciais, o sistema emite um cookie com um tíquete de autenticação. Em solicitações posteriores, o sistema primeiro verifica o cookie para ver se o servidor de relatório autenticou o usuário.

O Reporting Services pode ser estendido para dar suporte à Autenticação de Formulários que usa as interfaces de extensibilidade de segurança disponíveis por meio da API do Reporting Services. Se você estender o Reporting Services para usar a Autenticação de Formulários, use o protocolo TLS, anteriormente conhecido como protocolo SSL, para todas as comunicações feitas com o servidor de relatório, a fim de impedir que usuários maliciosos obtenham acesso ao cookie de outro usuário. O TLS permite que clientes e um servidor de relatório autentiquem uns aos outros e garantam que nenhum outro computador possa ler o conteúdo das comunicações entre os dois computadores. Todos os dados enviados de um cliente por meio de uma conexão TLS são criptografados para que usuários mal-intencionados não possam interceptar senhas ou dados enviados a um servidor de relatório.

A Autenticação de Formulários é implementada para oferecer suporte a contas e autenticação para plataformas diferentes do Windows. Uma interface gráfica é apresentada a um usuário que solicite acesso a um servidor de relatório e as credenciais fornecidas serão enviadas a uma autoridade de segurança para autenticação.

A Autenticação de Formulários exige que uma pessoa esteja presente para inserir as credenciais. Para aplicativos autônomos que se comunicam diretamente com o serviço Web Reporting Services, a Autenticação de Formulários deve ser combinada a um esquema de autenticação personalizado.

A Autenticação de Formulários é apropriada para o Reporting Services quando:

  • Você precisa armazenar e autenticar usuários que não têm contas do Microsoft Windows e

  • Você precisa fornecer seu próprio formulário de interface do usuário como uma página de entrada entre páginas diferentes em um site.

Considere os seguintes pontos ao escrever uma extensão de segurança personalizada que ofereça suporte à Autenticação de Formulários:

  • Se você usar a Autenticação de Formulários, o acesso anônimo deverá ser habilitado no diretório virtual de servidor de relatório no IIS (Serviços de Informações da Internet).

  • A autenticação do ASP.NET deve ser definida como Formulários. Você configura autenticação do ASP.NET no arquivo Web.config para o servidor de relatório.

  • O Reporting Services pode autenticar e autorizar usuários com a Autenticação do Windows ou com a autenticação personalizada, mas não com as duas. O Reporting Services não oferece suporte ao uso simultâneo de várias extensões de segurança.