Autorizzazione in Reporting Services

L'autorizzazione è il processo tramite cui viene determinato se a un'identità deve essere concesso il tipo di accesso richiesto a una determinata risorsa nel database del server di report. In Reporting Services viene utilizzata un'architettura di autorizzazione basata sui ruoli che consente di concedere a un utente l'accesso a una determinata risorsa in base all'assegnazione di ruolo dell'utente per l'applicazione. Le estensioni di protezione per Reporting Services contengono un'implementazione di un componente di autorizzazione utilizzata per concedere l'accesso agli utenti dopo l'autenticazione nel server di report. L'autorizzazione viene richiamata quando un utente tenta di eseguire un'operazione nel sistema o in un elemento del server di report tramite l'API SOAP e l'accesso con URL. Ciò è possibile tramite l'interfaccia dell'estensione di protezione IAuthorizationExtension. Come dichiarato in precedenza, tutte le estensioni ereditano da IExtension, l'interfaccia di base per qualsiasi estensione distribuita. IExtension e IAuthorizationExtension sono membri dello spazio dei nomi Microsoft.ReportingServices.Interfaces.

Controllo dell'accesso

Nell'ambito dell'autorizzazione, la chiave per qualsiasi implementazione della protezione personalizzata è il controllo dell'accesso, implementato nel metodo CheckAccess. Il metodo CheckAccess viene chiamato ogni volta che un utente tenta di eseguire un'operazione nel server di report. Il metodo CheckAccess è sottoposto a overload per ogni tipo di operazione. Per le operazioni sulle cartelle, un esempio di controllo dell'accesso potrebbe essere simile al seguente:

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

Il server di report chiama il metodo CheckAccess passando il nome dell'utente connesso, un token utente, il descrittore di protezione per l'elemento e l'operazione richiesta. A questo punto il descrittore di protezione viene controllato per verificare se il nome utente e l'autorizzazione sono appropriati per il completamento della richiesta, quindi viene restituito true per indicare che l'accesso è concesso o false per indicare che l'accesso è negato.

Descrittori di protezione

Quando si impostano i criteri di autorizzazione per gli elementi nel database del server di report, un'applicazione client (ad esempio Gestione report) invia le informazioni utente all'estensione di protezione insieme a un criterio di protezione per l'elemento. Il criterio di protezione e le informazioni utente sono collettivamente denominati descrittore di protezione. Un descrittore di protezione contiene le informazioni seguenti per un elemento nel database del server di report:

  • Gruppo o utente che dispone di un tipo di autorizzazione per l'esecuzione di operazioni sull'elemento.

  • Tipo di elemento.

  • Elenco di controllo di accesso discrezionale che controlla l'accesso all'elemento.

I descrittori di protezione vengono creati utilizzando i metodi SetPolicies e SetSystemPolicies del servizio Web.

Flusso di autorizzazione

L'autorizzazione in Reporting Services viene controllata dall'estensione di protezione attualmente configurata per l'esecuzione nel server. L'autorizzazione è basata sul ruolo ed è limitata alle autorizzazioni e alle operazioni fornite dall'architettura di protezione di Reporting Services. Nel diagramma seguente è illustrato il processo di autorizzazione degli utenti per l'utilizzo degli elementi nel database del server di report:

Flusso delle autorizzazioni di protezione per Reporting Services

Come illustrato in questo diagramma, per l'autorizzazione viene applicata la sequenza seguente:

  1. Dopo l'autenticazione, le applicazioni client inviano le richieste al server di report tramite i metodi del servizio Web Reporting Services. Un ticket di autenticazione viene passato al server di report sotto forma di cookie nell'intestazione HTTP di ogni richiesta Web.

  2. Il cookie viene convalidato prima di qualsiasi controllo dell'accesso.

  3. Dopo la convalida del cookie, il server di report chiama GetUserInfo e all'utente viene fornita un'identità.

  4. L'utente tenta di eseguire un'operazione tramite il servizio Web Reporting Services.

  5. Il server di report chiama il metodo CheckAccess.

  6. Il descrittore di protezione viene recuperato e passato a un'implementazione dell'estensione di protezione personalizzata di CheckAccess. A questo punto, l'utente, il gruppo o il computer viene confrontato con il descrittore di protezione dell'elemento a cui viene eseguito l'accesso e viene autorizzato a eseguire l'operazione richiesta.

  7. Se l'utente è autorizzato, il servizio Web esegue l'operazione e restituisce una risposta all'applicazione chiamante.