Como crear un MembershipProvider personalizado
Estaba navegando por el newsgroup de soporte que tiene Microsoft y una de las primeras dudas que veo de alguien era directamente sobre algo en lo que estuve mirandome estos dos últimos días. ¡Casualidad! así que me he marcado un post respondiendole y de pasó aquí lo dejo también :)
La duda es sobre las limitaciones de SQLMembershipProvider y si se puede ampliar las funcionalidades de alguna forma. La respuesta es que si, creando nuestro propio MembershipProvider, y a continuación el How to de como sería esto:
-------------------
Curiosamente estoy haciendo ahora un MembershipProvider personalizado :) (Exactamente un Db4oMembershipProvider)
SQLMembershipProvider hereda de la clase MembershipProvider, que es la clase abstracta que define los métodos y propiedades que debe tener un MembershipProvider en general.
La clase que usas SQLMember... está como tu bien dices sólo para usar la estructura de datos que se crea automáticamente, etc.
Si necesitas algo más avanzado o personalizado tendrás que crearte tu propia clase, MyMembershipProvider (por ponerle un nombre)
Pasos que tendrás que hacer:
- Crearte una clase que herede de System.Web.Security.MembershipProvider
- Implementar todos los métodos y propiedades que tiene dicha clase. Esto con Visual Studio es muy fácil. Botón derecho en el nombre de la clase -> implementar métodos abstractos...
- Tendrás que escribir los métodos con las funcionalidades que necesitesutilizar, y los que no, puedes dejarlos con un throw new Exception("No implementado");
- Y bueno, hay una cosa un poco rara que te comento de paso. Todo MembershipProvider tiene que tener un nombre. Tendrás que definir una propiedad Name como algo parecido a:
---------------------------------------
private string _name;
public override string Name {
get { return _name; }
}
---------------------------------------
Y aquí está el problema, el nombre se le da al provider por medio de un método llamado Initialize, pero este creo que no estaba marcado como abstrac y por lo tanto por defecto no se genera el método override... tendrás que añadir algo como:
---------------------------------------
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
if (String.IsNullOrEmpty(name))
_name = "CMembershipProvider";
else
_name = name;
base.Initialize(name, config);
}
---------------------------------------
Después deberás agregar en el Web.Config unas líneas para indicar que quieres disponer de un determinado MembershipProvider dentro de tu catálogo de Providers y definirlo como por defecto:
---------------------------------------
<system.web>
[...]
<membership defaultprovider="MyMembershipProvider">
<providers>
<add name="MyMembershipProvider" type="MyNamespace.MyMembershipProvider" applicationname="/">
</add>
</providers>
[...]
</membership>
---------------------------------------
El name no tiene por que coincidir con el nombre de la clase, es sólo para identificarlo dentro del catálogo de Providers. Y en type es donde tendrás que poner la ruta a tu clase personalizada (incluyendo los namespaces).
Espero que te haya servido de ayuda ;)
Jaime
1 comentarios:
Saludos Jaime,
Estoy comenzando a interezarme por db4o y me gustaria construir un membershiproviders utilizando db4o como base de datos, dime algo como te fue en tu experimento lograste contruir el providers con db4o.
Por cierto existe un db4oProviders que se encuentra en codeplex, lo has utilizado... realmente no se como implantarlo en mi proyecto de asp.net
Saludos Jaime.
Publicar un comentario en la entrada