Implementar un proveedor de funciones

Actualización: noviembre 2007

La administración de funciones de ASP.NET permite utilizar con facilidad varios proveedores diferentes para las aplicaciones ASP.NET. Puede utilizar los proveedores de perfiles proporcionados que se incluyen en .NET Framework o puede implementar su propio proveedor.

Existen dos razones fundamentales para crear un proveedor de funciones personalizado

  • Necesita almacenar la información de las funciones en un origen de datos que no es compatible con los proveedores de funciones incluidos en .NET Framework, como una base de datos de FoxPro, una base de datos de Oracle u otro origen de datos.

  • Necesita administrar la información de funciones mediante un esquema de base de datos que es diferente del que utilizan los proveedores que se distribuyen con .NET Framework. Un ejemplo común serían los datos de autorización que ya existen en una base de datos de SQL Server de una compañía o un sitio Web.

Clases requeridas

Para implementar un proveedor de funciones, cree una clase que herede la clase abstracta RoleProvider del espacio de nombres System.Web.Security. La clase abstracta RoleProvider hereda la clase abstracta ProviderBase del espacio de nombres System.Configuration.Provider. Por tanto, debe implementar también los miembros necesarios de la clase ProviderBase. En las tablas siguientes se muestran las propiedades y los métodos necesarios de las clases abstractas ProviderBase y RoleProvider que debe implementar, junto con una descripción. Para consultar una implementación de cada uno de los miembros, vea el código proporcionado en Implementación del proveedor de funciones de ejemplo.

Miembros de ProviderBase

Miembro

Descripción

Método Initialize

Obtiene como entrada el nombre del proveedor y una clase NameValueCollection de las opciones de configuración. Se utiliza para establecer los valores de las propiedades en la instancia del proveedor, entre los que se incluyen los valores específicos de la implementación y las opciones especificadas en el archivo de configuración (Machine.config o Web.config).

Miembros de RoleProvider

Miembro

Descripción

Propiedad ApplicationName

Nombre de la aplicación que utiliza la información de las funciones especificada en el archivo de configuración (Web.config). La propiedad ApplicationName se almacena en el origen de datos con la información del usuario relacionada y se utiliza cuando se consulta la información del usuario. Consulte la sección de la propiedad ApplicationName que aparece más adelante en este mismo tema para obtener más información.

Esta propiedad es de lectura y escritura, y tiene como valor predefinido ApplicationPath si no se ha especificado ningún otro valor explícitamente.

Método AddUsersToRoles

Toma como entrada una lista de nombres de usuario y una lista de nombres de función, y asocia los usuarios establecidos a las funciones especificadas en el origen de datos de la propiedad ApplicationName configurada.

Debe producir una excepción ProviderException si no existe alguno de los nombres de función o de usuario especificados para la propiedad ApplicationName configurada.

Debe producir una excepción ArgumentException si alguno de los nombres de usuario o de función especificados es una cadena vacía, y una excepción ArgumentNullException si algunos de los nombres de función o de usuario especificados es null (Nothing en Visual Basic).

Si el origen de datos admite transacciones, debe incluir cada operación de agregación en una transacción, deshacer la transacción y producir una excepción si se produce un error en alguna de estas operaciones.

Método CreateRole

Toma como entrada el nombre de una función y agrega la función especificada al origen de datos de la propiedad ApplicationName configurada.

Debe producir una excepción ProviderException si el nombre de la función especificado ya existe en la propiedad ApplicationName configurada.

Debe producir una excepción ArgumentException si el nombre de función especificado es una cadena vacía, contiene una coma o excede la longitud máxima permitida por el origen de datos, y una excepción ArgumentNullException si el nombre de función especificado es null (Nothing en Visual Basic).

Método DeleteRole

Toma como entrada el nombre de una función y un valor booleano que indica si se producirá una excepción en caso de que todavía haya usuarios asociados a la función. La clase DeleteRole elimina la función especificada en el origen de datos de la propiedad ApplicationName configurada.

Si el parámetro throwOnPopulatedRole es true, y la función identificada por el parámetro de nombre de función tiene uno o varios miembros, produzca la excepción ProviderException y no elimine la función. Si el parámetro throwOnPopulatedRole es false, elimine la función tanto si está vacía como si no lo está.

Cuando elimine una función del origen de datos, compruebe que también elimina todas las asociaciones que existen entre un nombre de usuario y la función que desea eliminar en la propiedad ApplicationName configurada.

Debe producir una excepción ArgumentException si el nombre de la función especificado no existe o si es una cadena vacía. Debe producir una excepción ArgumentNullException si el nombre de la función especificado es null (Nothing en Visual Basic).

Método FindUsersInRole

Toma como entrada un nombre de función y un nombre de usuario para realizar la búsqueda, y devuelve una lista de usuarios en una función donde el nombre de usuario coincide con el objeto usernameToMatch proporcionado de la propiedad ApplicationName configurada. La compatibilidad del carácter comodín depende del origen de datos. Los usuarios se devuelven en orden alfabético por el nombre de usuario.

Se recomienda que produzca una excepción ProviderException si el nombre de la función especificado no existe en el origen de datos.

Método GetAllRoles

Devuelve una lista de los nombres de función del origen de datos. Sólo se recuperan las funciones de la propiedad ApplicationName especificada.

Si no existe ninguna función para la propiedad ApplicationName configurada, debe devolver una matriz de cadenas que no contenga elementos.

Método GetRolesForUser

Toma como entrada un nombre de usuario y devuelve los nombres de las funciones del origen de datos con las que está asociado el usuario especificado. Sólo se recuperan las funciones de la propiedad ApplicationName configurada.

Si no existe ninguna función para el usuario especificado en la propiedad ApplicationName configurada, debe devolver una matriz de cadenas que no contenga elementos.

Debe producir ArgumentException si el nombre de usuario especificado es una cadena vacía. Debe producir una excepción ArgumentNullException si el nombre de usuario especificado es null (Nothing en Visual Basic).

Método GetUsersInRole

Toma como entrada un nombre de función y devuelve los nombres de usuario asociados a una función del origen de datos. Sólo se recuperan las funciones de la propiedad ApplicationName configurada.

Si el nombre de la función especificado no existe en la propiedad ApplicationName configurada, debe producir una excepción ProviderException.

Si no hay ningún usuario asociado con la función especificada en la propiedad ApplicationName configurada, debe devolver una matriz de cadenas que no contenga elementos.

Debe producir una excepción ArgumentException si el nombre de función especificado es una cadena vacía, contiene una coma o excede la longitud máxima que el origen de datos permite para un nombre de función. Debe producir una excepción ArgumentNullException si el nombre de la función especificado es null (Nothing en Visual Basic).

Método IsUserInRole

Toma como entrada un nombre de usuario y un nombre de función y determina si el usuario que está conectado en la actualidad está asociado a una función del origen de datos de la propiedad ApplicationName configurada.

Debe producir una excepción ProviderException si el nombre de función o el nombre de usuario especificados no existen en la propiedad ApplicationName configurada.

Debe producir una excepción ArgumentException si el nombre de usuario o de función especificado es una cadena vacía y una excepción ArgumentNullException si el nombre de usuario o de función especificado es null (Nothing en Visual Basic).

Método RemoveUsersFromRoles

Toma como entrada una lista de nombres de usuario y una lista de nombres de función, y elimina la asociación de los usuarios establecidos en las funciones especificadas en el origen de datos de la propiedad ApplicationName configurada.

Debe producir una excepción ProviderException si no existe alguno de los nombres de función o alguno de los nombres de usuario especificados en la propiedad ApplicationName configurada.

Debe producir una excepción ArgumentException si alguno de los nombres de usuario o de función especificados es una cadena vacía, y una excepción ArgumentNullException si algunos de los nombres de función o de usuario especificados es null (Nothing en Visual Basic).

Si el origen de datos admite transacciones, debe incluir cada operación de eliminación en una transacción, deshacer la transacción y producir una excepción si se produce un error en alguna de estas operaciones.

Método RoleExists

Toma como entrada un nombre de función y determina si el nombre de la función existe en el origen de datos de la propiedad ApplicationName configurada.

Debe producir una excepción ArgumentException si el nombre de la función especificado no existe o si es una cadena vacía. Se recomienda que produzca una excepción ArgumentNullException si el nombre de función especificado es null (Nothing en Visual Basic).

ApplicationName

Los proveedores de funciones almacenan por separado la información de las funciones de cada aplicación. De este modo, varias aplicaciones ASP.NET pueden utilizar el mismo origen de datos sin que se produzcan conflictos si se utilizan nombres de usuario duplicados. Además, varias aplicaciones ASP.NET pueden utilizar el mismo origen de datos de funciones si especifican el mismo valor para la propiedad ApplicationName.

Como los proveedores de funciones almacenan por separado la información de funciones de cada aplicación, deberá comprobar que el esquema de datos incluye el nombre de la aplicación, y que éste también se incluye en las consultas y las actualizaciones. Por ejemplo, el comando siguiente se utiliza para recuperar un nombre de función de una base de datos y garantiza que la propiedad ApplicationName está incluida en la consulta.

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

Seguridad para subprocesos

Para cada proveedor de funciones especificado en la configuración de una aplicación, ASP.NET crea una única instancia del proveedor de funciones que se utiliza para todas las solicitudes atendidas por un objeto HttpApplication. Por tanto, puede tener varias solicitudes ejecutándose simultáneamente. ASP.NET no garantiza la seguridad para subprocesos de las llamadas a su proveedor. Deberá escribir el código del proveedor para que sea seguro para subprocesos. Si crea, por ejemplo, una conexión a una base de datos o abre un archivo para su edición, debe hacerlo dentro del miembro que se ha llamado, como el método AddUsersToRoles, en lugar de abrir un archivo o establecer una conexión a la base de datos cuando se llama al método Initialize.

Vea también

Conceptos

Implementación del proveedor de funciones de ejemplo

Proteger funciones

Otros recursos

Administrar autorizaciones con funciones