Custom MembershipProvider Y RoleProvider

El modelo de Proveedores desde su aparición con ASP.NET 2.0 ha sido un tema muy recurrente y se han escrito ríos de tinta sobre sus beneficios, pero ya sea porque realmente nos encontraremos en muchas ocasiones que los proveedores por defecto no cubren todas nuestras necesidades o porque hemos migrado una aplicación donde ya tenemos todos los datos o simplemente porque no tengo tanta imaginación, en este artículo mostraré como poder crear nuestro propio proveedor.

ASP.NET 2.0 ofrece soporte para el modelo de proveedores para diferentes servicios:

  • Membership
    • System.Web.Security.SqlMembershipProvider
    • System.Web.Security.ActiveDirectoryMembershipProvider
  • Roles
    • System.Web.Security.SqlRoleProvider
    • System.Web.Security.AuthorizationStoreRoleProvider
    • System.Web.Security.WindowsTokenRoleProvider
  • Profile
    • System.Web.Profile.SqlProfileProvider
  • SessionState
    • System.Web.SessionState.InProcSessionStateStore
    • System.Web.SessionState.OutOfProcSessionStateStore
    • System.Web.SessionState.SqlSessionStateStore
  • Configuration
    • System.Configuration.DPAPIProtectedConfigurationProvider
    • System.Configuartion.RSAProtectedConfigurationProvider
  • SiteMap
    • System.Web.XmlSiteMapProvider
  • WebEvents
    • System.Web.Management.EventLogWebEventProvider
    • System.Web.Management.SimpleMailWebEventProvider
    • System.Web.Management.SqlWebEventProvider
    • System.Web.Management.TemplatedMailWebEventProvider
    • System.Web.Management.WmiWebEventProvider
    • System.Web.Management.TraceWebEventProvider
  • WebParts
    • System.Web.UI.WebControls.WebParts.SqlPersonalizationProvider

La intención de este artículo no es profundizar en el modelo de proveedores sino aprovechar toda su potencia, imaginemos que tenemos una aplicación web que hemos migrado o que simplemente tiene que aprovechar los datos de otra aplicación, entonces crearemos nuestro proveedor basándonos en las clases MembershipProvider y RolProvider para que se adapte a nuestras necesidades.

Empezaremos con la base de datos en Access que hemos aprovechado de otra aplicación ;-)

Como podéis observar simplemente tenemos una tabla de usuarios una de roles y una tabla intermedia de UsuariosPorRol.

Crearemos nuestro primer proveedor con la clase Usuarios que herede de MembershipProvider, que al ser una clase abstracta nos facilitara la manera de implementar un proveedor de este subsistema Membership.

No es necesario sobreescribir todos los métodos de esta clase, solo los que tengamos que utilizar posteriormente.

Por  ejemplo el método ValidateUser:

public override bool ValidateUser(string username, string password){
  bool userExists = false;
  OleDbCommand command = new OleDbCommand();
  try{
   command.Connection = connection;
   command.CommandText = "SELECT IDUsuario FROM Usuarios
      Where Nombre=@Nombre AND Pass=@Pass";
   command.Parameters.AddWithValue("@Nombre", username);
   command.Parameters.AddWithValue("@Pass", password);
   command.Connection.Open();
   OleDbDataReader rd = command.ExecuteReader();
   if (rd.HasRows)
     userExists = true;
     }
     Catch…

 

O CreateUser:

 

public override MembershipUser CreateUser( string username,
   string password, string email, string passwordQuestion,
    string passwordAnswer, bool isApproved,
    object providerUserKey,
    out MembershipCreateStatus status)
{
    MembershipUser newUser = null;
    OleDbCommand command = new OleDbCommand();
    try{
       command.Connection = connection;
       command.CommandText = @"INSERT INTO Usuarios(
          Nombre, Mail, Pass) VALUES (@Nombre, @Mail, @Pass )";
      command.Parameters.AddWithValue("@Nombre", username);
      command.Parameters.AddWithValue("@Mail", email);
      command.Parameters.AddWithValue("@Pass", password);
      command.Connection.Open();
      command.ExecuteNonQuery();
      newUser = new MembershipUser("Usuarios", username, null,
      String.Empty, String.Empty,String.Empty, true, false,
      DateTime.Now,DateTime.Now, DateTime.Now,
      DateTime.Now,DateTime.Now);
      status = MembershipCreateStatus.Success;
      }
     Catch…

 

La clase Roles que hereda de RoleProvider e implementaremos métodos como:

public override string[] GetAllRoles()
{
   OleDbCommand command = new OleDbCommand();
   List<string> resultado = new List<string>();
   try{
     command.Connection = connection;
     command.CommandText = "SELECT Rol FROM Roles";
     command.Connection.Open();
     OleDbDataReader rd = command.ExecuteReader();
     while (rd.Read())
       resultado.Add(rd.GetString(0));
       return resultado.ToArray();
       }
    Catch…

Una vez que tenemos nuestros proveedores creados ya los podemos utilizar y para eso los  tenemos que definir en el web.config de nuestra aplicación.

<membershipdefaultProvider="Usuarios">
 <providers>
    <clear/>
    <addname="Usuarios" type="Demo.Seguridad.Usuarios"
       connectionStringName="MyProviderConnectionString"
       minRequiredNonalphanumericCharacters="0"
       requiresQuestionAndAnswer="false"
       enablePasswordReset="true"/>
 </providers>
</membership>

Definimos nuestro proveedor como proveedor por defecto y sus propiedades.

<roleManagerenabled="true"defaultProvider="Roles">
  <providers>
    <clear/>
  <addname="Roles"connectionStringName="MyProviderConnectionString"
    type="Demo.Seguridad.Roles"/>
 </providers>
</roleManager>

 

Para probar nuestros proveedores crearemos una página de login con un control asp:Login, una página de registro para crear nuevos usuarios con un control asp:CreateUserWizard

Y el proyecto funcionando se mostraría como

 

Para que podáis estudiar mejor el proyecto os lo podéis bajar desde:

Material Material

 

 

Anuncios

6 comentarios en “Custom MembershipProvider Y RoleProvider

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s