Autenticazione in Reporting Services

L'autenticazione è il processo di determinazione del diritto di un utente a un'identità. Per autenticare un utente sono disponibili numerose tecniche. La più comune consiste nell'utilizzo di password. Quando si implementa l'autenticazione basata su form, ad esempio, si vuole un'implementazione che esegue query sugli utenti per le credenziali (in genere da un'interfaccia che richiede un nome di accesso e una password) e quindi convalida gli utenti rispetto a un archivio dati, ad esempio una tabella di database o un file di configurazione. Se le credenziali non possono essere convalidate, il processo di autenticazione ha esito negativo e l'utente presuppone un'identità anonima.

Autenticazione personalizzata in Reporting Services

In Reporting Services l'autenticazione degli utenti viene gestita dal sistema operativo Windows tramite la sicurezza integrata o tramite operazioni esplicite di ricezione e convalida delle credenziali utente. L'autenticazione personalizzata può essere sviluppata in Reporting Services per supportare più schemi di autenticazione. Questo supporto è reso possibile tramite l'interfaccia IAuthenticationExtension2dell'estensione di sicurezza . Tutte le estensioni ereditano dall'interfaccia di base IExtension per qualsiasi estensione distribuita e utilizzata dal server di report. IExtension, e IAuthenticationExtension2sono membri dello spazio dei Microsoft.ReportingServices.Interfaces nomi .

La principale modalità di autenticazione in un server di report in Reporting Services è costituita dal metodo LogonUser. Questo membro del servizio Web Reporting Services può essere utilizzato per passare le credenziali utente a un server di report per la convalida. L'estensione di sicurezza sottostante implementa IAuthenticationExtension2.LogonUser, che contiene il codice di autenticazione personalizzato. Nell'esempio di autenticazione basata su form, LogonUser, che esegue un controllo di autenticazione in base alle credenziali fornite e a un archivio utente personalizzato in un database. Un esempio di implementazione di LogonUser è simile al seguente:

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

La funzione di esempio seguente viene utilizzata per verificare le credenziali fornite:

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

Flusso di autenticazione

Il servizio Web Reporting Services fornisce estensioni di autenticazione personalizzate per l'abilitazione dell'autenticazione basata su form da parte del portale Web e del server di report.

Il metodo LogonUser del servizio Web Reporting Services viene utilizzato per inviare le credenziali al server di report per l'autenticazione. Il servizio Web usa le intestazioni HTTP per passare un ticket di autenticazione (noto come "cookie") dal server al client per le richieste di accesso convalidate.

Nell'illustrazione seguente è rappresentato il metodo di autenticazione degli utenti per il servizio Web quando l'applicazione viene distribuita con un server di report configurato per l'utilizzo di un'estensione di autenticazione personalizzata.

Screenshot of the Reporting Services security authentication flow.

Come illustrato nella figura 2, il processo di autenticazione è il seguente:

  1. Un'applicazione client chiama il metodo LogonUser del servizio Web per autenticare un utente.

  2. Il servizio Web effettua una chiamata al metodo LogonUser dell'estensione di sicurezza. In particolare, la classe che implementa IAuthenticationExtension2.

  3. L'implementazione di LogonUser convalida il nome utente e la password nell'archivio utente o nell'autorità di sicurezza.

  4. Dopo la corretta esecuzione dell'autenticazione, il servizio Web crea un cookie e lo gestisce per la sessione.

  5. Il servizio Web restituisce il ticket di autenticazione all'applicazione chiamante nell'intestazione HTTP.

Quando un utente viene correttamente autenticato dal servizio Web tramite l'estensione di sicurezza, viene generato un cookie utilizzato per le richieste successive. Il cookie potrebbe non essere persistente all'interno dell'autorità di sicurezza personalizzata perché il server di report non è proprietario dell'autorità di sicurezza. Il cookie viene restituito dal metodo del servizio Web LogonUser e viene utilizzato nelle successive chiamate al metodo del servizio Web e nell'accesso con URL.

Nota

Per evitare di compromettere il cookie durante la trasmissione, i cookie di autenticazione restituiti da LogonUser devono essere trasmessi in modo protetto usando la crittografia TLS (Transport Layer Security), protocollo precedentemente noto come SSL (Secure Sockets Layer).

Se si accede al server di report tramite accesso con URL quando è installata un'estensione di sicurezza personalizzata, Internet Information Services (IIS) e ASP.NET gestiscono automaticamente la trasmissione del ticket di autenticazione. Se si accede al server di report tramite l'API SOAP, l'implementazione della classe proxy deve includere supporto aggiuntivo per la gestione del ticket di autenticazione. Per ulteriori informazioni sull'utilizzo dell'API SOAP e sulla gestione del ticket di autenticazione, vedere "Utilizzo del servizio Web con la sicurezza personalizzata".

Autenticazione basata su form

L'autenticazione basata su form è un tipo di autenticazione di ASP.NET con la quale un utente non autenticato viene indirizzato a un form HTML. Dopo che l'utente ha fornito le credenziali, il sistema produce un cookie contenente un ticket di autenticazione. Nelle richieste successive, il sistema controlla innanzitutto il cookie per verificare se il server di report ha autenticato l'utente.

È possibile estendere Reporting Services per supportare l'autenticazione basata su form usando le interfacce di estendibilità della sicurezza disponibili tramite l'API di Reporting Services. Se si estende Reporting Services per l'uso dell'autenticazione basata su moduli, usare TLS (Transport Layer Security), protocollo precedentemente noto come SSL (Secure Sockets Layer), per tutte le comunicazioni con il server di report per impedire a utenti malintenzionati di accedere al cookie di un altro utente. TLS consente ai client e a un server di report di autenticarsi a vicenda per assicurare che il contenuto delle comunicazioni tra i due computer non possa essere letto da nessun altro computer. Tutti i dati inviati da un client tramite una connessione TLS vengono crittografati in modo che gli utenti malintenzionati non possano intercettare password o dati inviati a un server di report.

L'autenticazione basata su form viene implementata per supportare gli account e l'autenticazione per piattaforme diverse da Windows. Quando un utente richiede l'accesso a un server di report, viene visualizzata un'interfaccia grafica e le credenziali fornite vengono inviate a un'autorità di sicurezza per l'autenticazione.

L'autenticazione basata su form richiede la presenza di una persona per l'immissione delle credenziali. Per le applicazioni automatiche che comunicano direttamente con il servizio Web Reporting Services, l'autenticazione basata su form deve essere utilizzata in combinazione con uno schema di autenticazione personalizzato.

L'autenticazione basata su form è adatta per Reporting Services nei casi seguenti:

  • È necessario archiviare ed autenticare gli utenti che non dispongono di account Microsoft Windows e

  • È necessario fornire un modulo di interfaccia utente personalizzato come pagina di accesso tra pagine diverse in un sito Web.

Quando si scrive un'estensione di sicurezza personalizzata che supporta l'autenticazione basata su form, tenere presente quanto segue:

  • Se si utilizza l'autenticazione basata su form, l'accesso anonimo deve essere abilitato nella directory virtuale del server di report in Internet Information Services (IIS).

  • L'autenticazione di ASP.NET deve essere impostata su Forms. È possibile configurare l'autenticazione di ASP.NET nel file Web.config per il server di report.

  • Reporting Services consente di autenticare e autorizzare gli utenti con l'autenticazione di Windows o con l'autenticazione personalizzata, ma non con entrambe. Reporting Services non supporta l'uso simultaneo di più estensioni di sicurezza.