Condividi tramite


Implementazione di un provider di ruoli

Aggiornamento: novembre 2007

La gestione dei ruoli ASP.NET offre un modo semplice per utilizzare provider differenti nelle applicazioni ASP.NET. È possibile utilizzare i provider di profili forniti con .NET Framework o implementare un provider personalizzato.

La creazione di un provider di ruoli personalizzato è consigliata quando:

  • Le informazioni relative ai ruoli devono essere archiviate in un'origine dati non supportata dai provider di ruoli inclusi in .NET Framework, ad esempio un database FoxPro o Oracle.

  • Le informazioni relative ai ruoli devono essere gestite utilizzando uno schema di database diverso da quello utilizzato dai provider forniti con .NET Framework. Un caso tipico è rappresentato dai dati di autorizzazione già presenti in un database SQL Server di un'azienda o un sito Web.

Classi obbligatorie

Per implementare un provider di ruoli occorre creare una classe che erediti la classe astratta RoleProvider dallo spazio dei nomi System.Web.Security. La classe astratta RoleProvider eredita a sua volta la classe astratta ProviderBase dallo spazio dei nomi System.Configuration.Provider. Di conseguenza, è necessario implementare anche i membri obbligatori della classe ProviderBase. Nelle tabelle riportate di seguito sono elencati i metodi e le proprietà che devono essere implementati dalle classi astratte ProviderBase e RoleProvider e viene fornita la relativa descrizione. Per la procedura di implementazione di ciascun membro, vedere il codice fornito per l'argomento Implementazione di un provider di ruoli di esempio.

Membri di ProviderBase

Membro

Descrizione

Metodo Initialize

Accetta come input il nome del provider e un oggetto NameValueCollection di impostazioni di configurazione. Viene utilizzato per impostare i valori delle proprietà per l'istanza del provider, inclusi i valori specifici dell'implementazione e le opzioni specificate nel file di configurazione (Machine.config o Web.config).

Membri di RoleProvider

Membro

Descrizione

Proprietà ApplicationName

Nome dell'applicazione che utilizza le informazioni relative ai ruoli specificate nel file di configurazione (Web.config). La proprietà ApplicationName viene archiviata nell'origine dati insieme alle informazioni utente correlate e viene utilizzata durante l'esecuzione di query su tali informazioni. Per ulteriori informazioni, vedere la sezione relativa alla proprietà ApplicationName più avanti in questo argomento.

Questa è una proprietà di lettura-scrittura. Se non viene specificata in modo esplicito, il valore predefinito è ApplicationPath.

Metodo AddUsersToRoles

Accetta come input un elenco di nomi utente e un elenco di nomi di ruolo e associa gli utenti specificati ai ruoli specificati nell'origine dati per la proprietà ApplicationName configurata.

Se uno dei nomi di ruolo o dei nomi utente specificati non esiste per la proprietà ApplicationName configurata, deve essere generata un'eccezione ProviderException.

Se uno dei nomi utente o dei nomi di ruolo specificati è una stringa vuota, deve essere generata un'eccezione ArgumentException. Se invece è null (Nothing in Visual Basic), deve essere generata un'eccezione ArgumentNullException.

Se l'origine dati supporta le transazioni, ciascuna operazione di aggiunta deve essere inclusa in una transazione e, in caso di errore durante una qualsiasi operazione di aggiunta, deve essere eseguito il rollback della transazione e deve essere generata un'eccezione.

Metodo CreateRole

Accetta come input il nome di un ruolo e aggiunge il ruolo specificato all'origine dati per la proprietà ApplicationName configurata.

Se il nome di ruolo specificato esiste già per la proprietà ApplicationName configurata, deve essere generata un'eccezione ProviderException.

Se il nome di ruolo specificato è una stringa vuota, contiene una virgola o supera la lunghezza massima consentita dall'origine dati, deve essere generata un'eccezione ArgumentException. Se invece è null (Nothing in Visual Basic), deve essere generata un'eccezione ArgumentNullException.

Metodo DeleteRole

Accetta come input il nome di un ruolo e un valore booleano che indica se deve essere generata un'eccezione nel caso in cui esistano ancora utenti associati al ruolo. Il metodo DeleteRole elimina il ruolo specificato dall'origine dati per la proprietà ApplicationName configurata.

Se il parametro throwOnPopulatedRole è true e il ruolo identificato dal parametro del nome di ruolo contiene uno o più membri, deve essere generata un'eccezione ProviderException e il ruolo non deve essere eliminato. Se il parametro throwOnPopulatedRole è false, il ruolo deve essere eliminato, indipendentemente dal fatto che sia vuoto.

Quando si elimina un ruolo dall'origine dati, verificare che vengano eliminate anche le eventuali associazioni tra un nome utente e il ruolo eliminato per la proprietà ApplicationName configurata.

Se il nome di ruolo specificato non esiste o è una stringa vuota, deve essere generata un'eccezione ArgumentException. Se invece è null (Nothing in Visual Basic), deve essere generata un'eccezione ArgumentNullException.

Metodo FindUsersInRole

Accetta come input un nome di ruolo e un nome utente da cercare e restituisce un elenco di utenti in un ruolo, dove il nome utente corrisponde al valore del parametro usernameToMatch fornito per la proprietà ApplicationName configurata. Il supporto dei caratteri jolly dipende dal tipo di origine dati. Gli utenti vengono restituiti in ordine alfabetico in base al nome utente.

Se il nome di ruolo specificato non esiste nell'origine dati, si consiglia di generare un'eccezione ProviderException.

Metodo GetAllRoles

Restituisce un elenco di nomi di ruolo definiti nell'origine dati. Verranno recuperati soltanto i ruoli relativi alla proprietà ApplicationName specificata.

Se non esiste alcun ruolo relativo alla proprietà ApplicationName configurata, deve essere restituita una matrice di stringhe senza alcun elemento.

Metodo GetRolesForUser

Accetta come input un nome utente e restituisce i nomi di ruolo a cui è associato l'utente specificato definiti nell'origine dati. Verranno recuperati soltanto i ruoli relativi alla proprietà ApplicationName configurata.

Se per l'utente specificato non esiste alcun ruolo relativo alla proprietà ApplicationName configurata, deve essere restituita una matrice di stringhe senza alcun elemento.

Se il nome utente specificato è una stringa vuota, deve essere generata un'eccezione ArgumentException. Se invece è null (Nothing in Visual Basic), deve essere generata un'eccezione ArgumentNullException.

Metodo GetUsersInRole

Accetta come input un nome di ruolo e restituisce i nomi utente associati a un ruolo definito nell'origine dati. Verranno recuperati soltanto i ruoli relativi alla proprietà ApplicationName configurata.

Se il nome di ruolo specificato non esiste per la proprietà ApplicationName configurata, deve essere generata un'eccezione ProviderException.

Se al ruolo specificato non è associato alcun utente per la proprietà ApplicationName configurata, deve essere restituita una matrice di stringhe senza alcun elemento.

Se il nome di ruolo specificato è una stringa vuota, contiene una virgola o supera la lunghezza massima consentita dall'origine dati, deve essere generata un'eccezione ArgumentException. Se invece è null (Nothing in Visual Basic), deve essere generata un'eccezione ArgumentNullException.

Metodo IsUserInRole

Accetta come input un nome utente e un nome di ruolo e determina se l'utente attualmente connesso è associato a un ruolo definito nell'origine dati per la proprietà ApplicationName configurata.

Se il nome di ruolo o il nome utente specificato non esiste per la proprietà ApplicationName configurata, deve essere generata un'eccezione ProviderException.

Se il nome utente o il nome di ruolo specificato è una stringa vuota, deve essere generata un'eccezione ArgumentException. Se invece è null (Nothing in Visual Basic), deve essere generata un'eccezione ArgumentNullException.

Metodo RemoveUsersFromRoles

Accetta come input un elenco di nomi utente e un elenco di nomi di ruolo e rimuove l'associazione per gli utenti specificati dai ruoli specificati nell'origine dati per la proprietà ApplicationName configurata.

Se uno dei nomi di ruolo o dei nomi utente specificati non esiste per la proprietà ApplicationName configurata, deve essere generata un'eccezione ProviderException.

Se uno dei nomi utente o dei nomi di ruolo specificati è una stringa vuota, deve essere generata un'eccezione ArgumentException. Se invece è null (Nothing in Visual Basic), deve essere generata un'eccezione ArgumentNullException.

Se l'origine dati supporta le transazioni, ciascuna operazione di rimozione deve essere inclusa in una transazione e, in caso di errore durante una qualsiasi operazione di rimozione, deve essere eseguito il rollback della transazione e deve essere generata un'eccezione.

Metodo RoleExists

Accetta come input un nome di ruolo e determina se tale nome esiste nell'origine dati per la proprietà ApplicationName configurata.

Se il nome di ruolo specificato non esiste o è una stringa vuota, deve essere generata un'eccezione ArgumentException. Se invece è null (Nothing in Visual Basic), si consiglia di generare un'eccezione ArgumentNullException.

ApplicationName

I provider di ruoli archiviano le informazioni relative ai ruoli in modo univoco per ciascuna applicazione. Questo consente a più applicazioni ASP.NET di utilizzare la stessa origine dati senza generare un conflitto in caso di utilizzo di nomi utente duplicati. In alternativa, più applicazioni ASP.NET possono utilizzare la stessa origine dati specificando la stessa proprietà ApplicationName.

Poiché i provider di ruoli archiviano le informazioni relative ai ruoli in modo univoco per ciascuna applicazione, è necessario assicurarsi che lo schema dati, le query e gli aggiornamenti includano il nome dell'applicazione. Il comando riportato di seguito, ad esempio, consente di recuperare un nome di ruolo da un database e di verificare che la proprietà ApplicationName sia inclusa nella query.

SELECT Rolename FROM Roles 
  WHERE Rolename = 'Administrators' AND ApplicationName = 'MyApplication'

Indipendenza dai thread

Per ciascun provider di ruoli specificato nella configurazione di un'applicazione, ASP.NET crea una singola istanza di provider di ruoli che viene utilizzata per tutte le richieste servite da un oggetto HttpApplication. È quindi possibile che più richieste vengano eseguite simultaneamente. ASP.NET non garantisce l'indipendenza dai thread per le chiamate al provider. È quindi necessario scrivere il codice del provider in modo che risulti thread-safe. Ad esempio, la creazione di una connessione a un database o l'apertura di un file per la modifica deve essere effettuata all'interno del membro che viene chiamato, quale AddUsersToRoles, e non al momento della chiamata al metodo Initialize.

Vedere anche

Concetti

Implementazione di un provider di ruoli di esempio

Protezione dei ruoli

Altre risorse

Gestione delle autorizzazioni tramite ruoli