Condividi tramite


Concessione di autorizzazioni a livello di riga in SQL Server (ADO.NET)

In alcuni scenari è necessario controllare l'accesso a un livello caratterizzato da una maggior granularità rispetto a quanto consentito dalla semplice concessione, revoca o negazione delle autorizzazioni sui dati. Ad esempio, in un'applicazione di database utilizzata in un ospedale le informazioni sui pazienti possono essere archiviate in un'unica tabella, ma che sia necessario consentire ai medici di visualizzare solo le informazioni correlate ai propri pazienti. Scenari simili sono presenti in molti ambienti, tra cui quelli delle applicazioni destinate al settore finanziario, legale, statale e militare. In SQL Server non è tuttavia disponibile il supporto per implementare la sicurezza a livello di riga. È quindi necessario creare nelle tabelle colonne aggiuntive per definire i meccanismi di filtro di riga.

Implementazione di autorizzazioni a livello di riga

Le autorizzazioni a livello di riga vengono utilizzate per applicazioni che archiviano informazioni in un'unica tabella. Ogni riga include una colonna che definisce un parametro discriminante, ad esempio un nome utente, un'etichetta o un altro identificatore. Vengono quindi create stored procedure con parametri, passando il valore appropriato. Gli utenti potranno pertanto visualizzare solo le righe corrispondenti al valore specificato.

Nella procedura seguente viene descritto come configurare le autorizzazioni a livello di riga basate su un nome utente o un nome di accesso.

  • Creare la tabella, aggiungendo un'ulteriore colonna per l'archiviazione del nome.

  • Creare una visualizzazione contenente una clausola WHERE basata sulla colonna del nome utente. In tal modo le righe restituite saranno solo quelle contenenti il valore specificato. Utilizzare una delle funzioni predefinite per specificare un nome utente o un nome di accesso del database. In tal modo non sarà necessario creare visualizzazioni diverse a seconda degli utenti.

    ' Returns the login identification name of the user.
    WHERE UserName = SUSER_SNAME()

    ' USER_NAME or CURRENT_USER Return the database user name.
    WHERE UserName = CURRENT_USER()
  • Creare stored procedure per selezionare, inserire, aggiornare ed eliminare dati sulla base della visualizzazione e non delle tabelle di base. La visualizzazione includerà un filtro per limitare il numero di righe restituite o modificate.

  • Per le stored procedure che inseriscono dati, acquisire il nome utente utilizzando la stessa funzione specificata nella clausola WHERE della visualizzazione e inserire tale valore nella colonna UserName.

  • Negare al ruolo public tutte le autorizzazioni sulle tabelle e sulle visualizzazioni. Gli utenti non saranno in grado di ereditare autorizzazioni da altri ruoli del database poiché la clausola WHERE è basata su nomi utenti o di accesso e non su ruoli.

  • Concedere ai ruoli del database l'autorizzazione EXECUTE sulle stored procedure. Gli utenti potranno accedere ai dati solo tramite le stored procedure specificate.

Risorse esterne

Per ulteriori informazioni, vedere la seguente risorsa.

Implementing Row- and Cell-Level Security in Classified Databases Using SQL Server 2005+++ nel sito SQL Server TechCenter.

Viene descritto come utilizzare la sicurezza a livello di riga e di cella per soddisfare requisiti di sicurezza dei database classificati.

Vedere anche

Concetti

Scenari di sicurezza delle applicazioni in SQL Server (ADO.NET)

Gestione delle autorizzazioni con le stored procedure in SQL Server (ADO.NET)

Scrittura di istruzioni SQL dinamiche protette in SQL Server (ADO.NET)

Altre risorse

Protezione di applicazioni ADO.NET

Panoramica della sicurezza di SQL Server (ADO.NET)