Resumen: El componente de Membresía de asp.net 2.0 proporciona un conjunto de interfaces muy simples y fáciles de usar para que los desarrolladores realicen la administración y verificación de usuarios. Este artículo analizará brevemente su principio de implementación, presentará cómo usarlo correctamente y cómo extenderlo.
1. Clase abstracta MembershipProvider
En muchos casos, no usamos esta clase directamente cuando usamos Membership. La clase MembershipProvider define algunos métodos abstractos y atributos abstractos. Son estos métodos y atributos los que constituyen las especificaciones básicas de la interfaz Membership, y todas las funciones de uso de Membership dentro del marco .NET se llaman a través de este tipo. Las clases heredadas proporcionan funciones de administración de usuarios en diferentes entornos mediante la implementación de estas interfaces y no tienen ningún impacto en el marco de membresía en sí. Echemos un vistazo a la definición del prototipo de MembershipProvider:
clase abstracta pública MembershipProvider: ProviderBase
...{
// Eventos
evento público MembershipValidatePasswordEventHandler ValidatingPassword;
// Métodos
protected MembershipProvider();
public abstract bool ChangePassword(cadena nombre de usuario, cadena oldPassword, cadena nuevaContraseña);
public abstract bool ChangePasswordQuestionAndAnswer(cadena nombre de usuario, cadena contraseña, cadena nuevaContraseñaPregunta, cadena nuevaContraseñaRespuestaMembresíaCreateUser(cadena nombre de usuario, cadena
);
contraseña, cadena de correo electrónico, cadena contraseñaPregunta, cadena contraseñaAnswer, bool isApproved, objeto proveedorUserKey, estado MembershipCreateStatus);
byte virtual protegido [] DecryptPassword (byte [] encodedPassword
público abstracto bool DeleteUser (cadena nombre de usuario, bool eliminar AllRelatedDatacadena interna EncodePassword
);
(paso de cadena, formato de contraseña int, sal de cadena);
byte virtual protegido [] EncryptPassword (byte [] contraseña
abstracta pública MembershipUserCollection FindUsersByEmail (cadena emailToMatch, int pageIndex, int pageSize, out int resumen
público MembershipUserCollection FindUsersByName (cadena nombre de usuarioToMatch
);, int pageIndex, int pageSize, out int totalRecords);
cadena interna GenerateSalt(); resumen
público
MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords
int GetNumberOfUsersOnline();
respuesta);
miembro abstracto público GetUser (objeto proveedorUserKey, usuario boolIsOnline);
usuario abstracto público
GetUser
(nombre de usuario de cadena, usuario interno boolIsOnline);
vacío virtual protegido OnValidatingPassword (ValidatePasswordEventArgs e);
cadena abstracta pública ResetPassword (nombre de usuario de cadena, respuesta de cadena)
; cadena interna UnEncodePassword (paso de cadena, formato de contraseña
pública int UnlockUser (nombre de usuario abstracto
público de cadena) UpdateUser (usuario MembershipUser);
bool abstracto público ValidateUser (nombre de usuario de cadena, contraseña de cadena);
// Propiedades
cadena abstracta pública Nombre de la aplicación ...{ get; set }
public abstract bool EnablePasswordReset ...{ get }
public abstract bool EnablePasswordRetrieval ...{ get }
public abstract int MaxInvalidPasswordAttempts ...{ get
} abstract int MinRequiredNonAlphanumericCharacters ...{ get;
public abstract int MinRequiredPasswordLength ...{ get;
public abstract int PasswordAttemptWindow ...{ get }
public abstract MembershipPasswordFormat ...{ get }
public abstract string PasswordStrengthRegularExpression ... { get; }
bool abstracto público RequierePregunta y respuesta ... { obtener }
bool abstracto público Requiere correo electrónico único ... { obtener }
// Campos
privados MembershipValidatePasswordEventHandler _EventHandler;
private const int SALT_SIZE_IN_BYTES = 0x10
;
El modificador interno son varios métodos que son métodos auxiliares para contraseñas, que se utilizan para cifrar, descifrar y verificar contraseñas. Pero parece haber algunos problemas con el diseño aquí. Parece un poco inapropiado definir estos métodos como alcance interno. Estos métodos se definen en la clase base para que puedan reutilizarse, pero desde el punto de vista del efecto, así es. no es el caso, porque los miembros internos solo pueden usarse dentro de esta asamblea (en circunstancias normales, otros métodos como la reflexión no están incluidos), lo que significa que nuestro propio MembershipProvider extendido no puede usar estos métodos. Y a juzgar por el ámbito de aplicación actual, estos métodos actualmente solo se usan en SqlMembershipProvider, por lo que creo que estos modificadores de métodos deberían cambiarse a protegidos.
2. Clase estática de membresía
Como se mencionó anteriormente, en circunstancias normales no usaremos directamente la abstracción MembershipProvider, porque implica el problema de cómo crear una instancia de la clase de servicio de membresía real y, en general, implica la configuración y la creación de instancias de objetos. Preguntas difíciles y, para los principiantes, no son fáciles de dominar. En el marco .NET, esta capa de relaciones complejas está protegida por la membresía de clase estática (clase estática). Además de proteger a los usuarios de la lectura de archivos de configuración, objetos iniciales y otras tareas básicas, la membresía (clase estática) también juega un papel importante en la recarga de todos los MembershipProviders, por lo que existen API para que su uso sea más conveniente para los usuarios. (Clase estática) también recarga estos métodos. Cargado como un método estático y proporciona implementaciones sobrecargadas más ricas basadas en la API básica de MembershipProvider para que los usuarios las llamen. Esto es compatible directamente ya sea en la capa de interfaz de usuario u otros proyectos, simplemente consulte el espacio de nombres System.Web.Security y podrá disfrutar de las diversas comodidades que brinda la membresía sin preocuparse por ningún detalle. Echemos un vistazo a la definición del prototipo de Membresía (Clase estática): (Use .NET Reflector de Lutz Roder para ver todas sus implementaciones).
Public static class Membership
...{
// Eventos
public static event MembershipValidatePasswordEventHandler ValidatingPassword;
// Métodos
Membresía estática();
Usuario de membresía estática pública CreateUser (nombre de usuario de cadena, contraseña de cadena)
Usuario de membresía estática pública CreateUser (nombre de usuario de cadena, contraseña de cadena, correo electrónico de cadena
)
contraseñaPregunta,cadena
contraseñaAnswer, bool isApproved, estado de MembershipCreateStatus)
;
bool estático público DeleteUser (nombre de usuario
de cadena, bool eliminarTodosRelatedData);
MembershipUserCollection estáticopúblico FindUsersByEmail
(
cadena emailToMatch)
;
,
out int totalRecords);GetCurrentUserName();
public static int GetNumberOfUsersOnline()
;
public
static MembershipUser GetUser(
);
GetUser (nombre de usuario de cadena);
Usuario de membresía estática pública GetUser (objeto proveedorUserKey, bool userIsOnline);
Usuario de membresía estática pública GetUser (nombre de usuario de cadena, bool userIsOnline,
cadena
estáticapública
GetUserNameByEmail (cadena emailToMatch);
(usuario MembershipUser);
bool estático público ValidateUser (nombre de usuario de cadena, contraseña de cadena);
// Propiedades
cadena estática pública Nombre de la aplicación ...{ get; set }
bool estático público EnablePasswordReset ...{ get; }
bool estático público EnablePasswordRetrieval ...{ get }
cadena estática pública HashAlgorithmType ...{ get
} static bool IsHashAlgorithmFromMembershipConfig ...{ get;
public static int MaxInvalidPasswordAttempts ...{ get;
public static int MinRequiredNonAlphanumericCharacters ...
{ get } public static int MinRequiredPasswordLength ...{ get }
public static int PasswordAttemptWindow ... { get; }
cadena estática pública PasswordStrengthRegularExpression ...{ get; }
Proveedor de MembershipProvider estático público
...{ get; } Proveedores de MembershipProviderCollection estático
público
...{ get;
int UserIsOnlineTimeWindow ...{ obtener }
//
Puntuaciones de caracteres privados estáticos;
bool estático privado s_HashAlgorithmFromConfig;
cadena estática privada s_HashAlgorithmType;
proveedor
estático privado s_Initialized;
estático
int
s_UserIsOnlineTimeWindow
;
}
Dicho esto, tengo que decir algunas palabras. En el proceso de observar el código de implementación de Membresía (clase estática), puede encontrar que cada sobrecarga de la API de Membersip termina llamando al método del atributo Proveedor. El tipo de este atributo es el tipo MembershipProvider. puede entender Comprendamos el importante papel de MembershipProvider. También hay un atributo de Proveedores, que sirve para obtener todas las clases de servicios de Membresía configuradas en web.config. Todas son propiedades estáticas, pero ¿cómo se crean instancias de ellas? Al llamar al método Membership.Initialize (), cada vez que se llamen estas dos propiedades, se llamará a este método para determinar si la clase de servicio proporcionada por Membership se ha inicializado. De lo contrario, se llamará a la clase de servicio de configuración para leer la configuración. Contenido para inicializar. Llegados a este punto, puede que no le resulte difícil comprender por qué nos resulta tan fácil de utilizar.
3. Introducción y configuración de uso de SqlMembershipProvider
. A través de la introducción anterior, debería poder comprender básicamente la estructura general de la membresía, ¿verdad? (Si aún no lo ha hecho, es posible que no haya abierto .NET Reflector de Lutz Roder para analizar su código de implementación, o que aún no haya entendido el papel de las clases abstractas). Pase lo que pase, nuestro objetivo final es aprender a utilizarlo.
Antes de eso, primero quiero presentar las dos clases de implementación de MembershipProvider proporcionadas en el marco .NET: ActiveDirectoryMembershipProvider y SqlMembershipProvider (¿Cómo puede conocer estas dos clases? Puede ver todas las clases heredadas en Tipos derivados de MembershipProvider). La primera proporciona usuario básico administración bajo Active Directory (no lo he practicado), y esta última es la implementación de administración de usuarios basada en SqlServer que usamos con más frecuencia.
Es hora de presentar cómo usarlo. De hecho, ya hay artículos sobre esto en el jardín ((Traducción) Cómo usar la membresía en ASP.NET 2.0), así que no desperdiciaré más palabras. Pero aquí quiero contarles la forma más directa de aprenderlo y usarlo como referencia. Busque y abra machine.config en el disco del sistema, busque el nodo AspNetSqlMembershipProvider y vea si puede verlo. De hecho, esta es la configuración de membresía más básica, pero carece de la especificación del atributo defaultProvider. Puede utilizar el control de inicio de sesión; no es necesario utilizar ningún código para verificar el inicio de sesión del usuario. Si no lo crees, puedes intentarlo. (En cuanto a la verificación de formularios, no la presentaré aquí. Puede consultar la información relevante. Para obtener más información sobre SqlMembershipProvider, consulte MSDN).
4. Cómo personalizar MembershipProvider y otros recursos existentes de MembershipProvider
Entonces, ¿cómo personalizamos un MembershipProvider? De hecho, si ya comprende la estructura de la Membresía, creo que no le resultará difícil. Sin embargo, considerando que todavía requiere cierta cantidad de trabajo y dificultad escribir un MembershipProvider completo. Para nosotros, es posible que haya más lugares para ampliar el proveedor existente, como SqlMembershipProvider. De hecho, esto es muy simple, solo necesitamos heredar de SqlMembershipProvider (le digo en voz baja, lo que se guarda en el parámetro de configuración del método Inicializar es el nombre del atributo y el valor de la sección de configuración correspondiente del Proveedor) y luego extender y. reescribir los métodos requeridos. Al usarlo, en la sección de configuración del Proveedor, cambie el valor de tipo a su nombre de clase y estará bien.
Finalmente, ya existen en el mercado muchos MembershipProviders en diferentes entornos, como mysql, Oracle, etc. Aquí está la implementación de Mysql: http://www.codeproject.com/aspnet/mysqlmembershipprovider.asp . Hay más implementaciones diferentes. Creo que puede encontrar más ayuda en Google.
Bien, ya he dicho demasiado. Espero que pueda ser útil para quienes se han tomado la molestia de leer este blog. Gracias ^_*.