lunes, octubre 16, 2006

Asp.Net - Extendiendo Membership Access

En dias pasado me di a la tarea de integrar los Temas (Themes) de Asp.Net al proyecto de MedSid. Para esto estuve analizando como implementar esta opcion. Me decidi por colocar la opcion dentro de los parametros de los usuarios que tienen acceso a la aplicacion. Para esto estoy usando una base de datos de ms access, pues creo que es mas facil de manejar estas bases de datos, sobre todo si sera de tipo local la aplicacion. He usado en otras ocasiones esta base de datos, y aunque mucha gente critica su uso. La verdad es que es muy práctica.

Por otra parte existen algunos puntos de la licencia MS SQL Express Edition que no me gustan, y en realidad crear un archivo .mdf puede hacerse desde el mismo Control Panel de Windows, sin necesidad de tener instalado MS Access.

Total que como no quiero usar MS SQL, obtuve el Sample Access Provider Starter Kit que se puede obtener de microsoft msdn starter kits, el cual contiene una base de datos de MS Access (En otro articulo platicare como instalar esta base de datos).

Ahora bien, la tabla que modifique es aspnet_Membership, agregue un campo llamado "Theme", el tipo de datos que le puse es "Texto" con un tamaño de 50 caracteres. En SQL seria un varchar(50).

Una vez que se hizo la modificación de la base de datos de MS Access, lo siguiente es código. Lo primero es modificar el web.config, agregar la cadena de conexion para que sea mas sencillo, dentro del Tag de colocamos:

< providername="System.Data.OleDb" connectionstring="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Inetpub\Webs\MedSid\App_Data\ASPNetDB.mdb" name="AccessFileNameString">

A continuacion modifique la pagina default.aspx y agregue en la parte del codigo de < runat="server">:

Dim drTema As System.Data.OleDb.OleDbDataReader
drTema = obtenTema()
While drTema.Read()
Session("Theme") = drTema("Theme") 'Se coloca el tema en una variable de sesion
End While

' Se obtiene el tema precisamente de la variable de sesion, en caso de no tener ningun tema se muestra el tema default, que en este caso es MedSid
Dim ThemeName As String
ThemeName = Session("Theme")
If ThemeName <> Nothing Then
Page.Theme = ThemeName
Else
Page.Theme = "MedSid"
End If

Function obtenTema() As System.Data.IDataReader
Dim connectionString As String = System.Configuration.ConfigurationManager.ConnectionStrings("AccessFileNameString").ConnectionString.ToString
Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)

Dim queryString As String = "SELECT aspnet_Membership.Theme " & _ "FROM aspnet_Membership"
Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
dbCommand.CommandText = queryString
dbCommand.Connection = dbConnection

dbConnection.Open()
Dim dataReader As System.Data.IDataReader = dbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection)

Return dataReader
End Function

De esta manera modificamos la tabla de membeship de manera muy sencilla y asi se vuelve un poco mas útil esta base de datos, y no sólo para el control de los permisos en nuestro sitio web.

Listo!

11 comentarios:

Anónimo dijo...

No puedo agregar la base de datos que pones en el ejemplo.

Fabian dijo...

Hola, mira estoy buscando informacion sobre esto del membership de asp.net pero lo que quiero saber si existe alguna forma donde pueda acoplarlo a mi proyecto que ya tengo con mi propia base de datos, es posible esto?

vgarcias dijo...

Si, si puedes acoplarlo a diferentes bases de datos entre ellas MySQL, Oracle, DB2, etc. Lo que tienes que hacer es respetar la estructura de las tablas que se presentan para membership. En la siguiente direccion http://www.mono-project.com/Guide:_Porting_ASP.NET_Applications
existe una explicacion de como usar membership en otras bases de datos, el ejemplo es para Mono y PostgreSQL. Pero creo que puede ayudarte.
Listo!

Fabian dijo...

Entonces sacame de duda, por ejemplo si tengo mi base de datos que se llama BDComerce, tendría que crear mi propio proveedor de acceso para ingresar a esa base de datos??

En caso de ser así, existe alguna plantilla predefinida para SQL server donde pueda cambiar la cadena de conexion e indicar las tablas que seran las que usare para los usuarios y roles?

Fabian dijo...

otra cosa que no me queda muy claro es la parte donde me decis "Lo que tienes que hacer es resptear la estructura de las tablas que se presentan para membership"

A que te referís con eso? Es que acaso no puedo usar cualquier tabla ?

Porfa explicame un poquito más eso.

vgarcias dijo...

Me parece que lo que quieres es usar las tablas de BDCommerce, en especial aquellas que tienen los campos de usuarios registrados, no es asi?.
Si lo anterior es correcto, en realidad ya tienes un esquema de seguridad implementado. Por lo cual no se hace practico usar los controles intrínsecos a membership, como login, wizard account, etc.
Creo que tienes 2 opciones:
1.- Tienes que construir tu objetos de negocios para estos procedimientos de seguridad. Puedes usar algunos controles provenientes de membership, pero de forma muy limitada.
2.- Por otra parte, puedes instalar membership en tu sql server, y crear un store procedure que agregue los datos de las tablas de membership a tu bdcommerce.

En cualquier caso te recomiendo le des una revisada a la libreria de MSDN "How to: Implement a Custom Membership User " http://msdn2.microsoft.com/en-us/library/ms366730.aspx

Si es una aplicación que estas creando, te recomiendo que partas de las tablas de membership para evitar tener posiblemente 2 tablas de usuarios.

Que es precisamente lo que pretende este blog, es decir ya una vez que tienes membership en tu aplicacion, agregale algunas opciones extras, digamos apellido materno, una DireccionID, etc, a las tablas, para luego colocar en la misma base de datos o en su caso en el mismo servidor las tablas de un carrito de compras, catalogo, tasks, etc.

Fabian dijo...

Bueno, por lo que veo, vos decis que tendía redundancia de datos al tener dos tablas para almacenar lo mismo, la tabla usuarios de mi BD y también la tabla usuarios de la base de datos del membership, mira en realidad lo que yo quiero hacer es lo siguiente, talvez me estoy amargando la existencia...

Me interesa mucho el tema de los roles, y quiero q mi aplicación web, al momento de iniciar sesión detecte a que rol pertenece el usuario y pueda ingresar a ciertas páginas asignas, se muy bien que el membership está destinado para esto, pero que sucede con aquellos que ya tenemos una aplicación creada y queremos acoplar esto?

Que me sugieres??

vgarcias dijo...

Creo que lo mejor para este caso es usar la opción 2 que mencione en el comentario anterior.
Dejar que membership administre tus usuarios y mediante algunos store procedures mantener normalizada tu base de bdcommerce

Anónimo dijo...

a ver, dejame ver si entiendo, esos nuevos campos que yo deseo, por ejemplo telefono, direccion, etc, vos los agregaste ahi mismo en la tabla????

yo vi que en otra página hacían lo mismo pero en ves de ponerlo en la tabla lo ponían en el web.config

Anónimo dijo...

Not bad article, but I really miss that you didn't express your opinion, but ok you just have different approach

Dayanne Coronado dijo...

Disculpa, pero quería saber si me podrías ayudar con membership de MVC4. Esto es porque al generar proyectos con MVC4 la estructura de membership cambia y ya no se declara o en el archivo webconfig y necesito saber como conectar mi aplicación MVC4 utilizando membership con PostgreSQL, ya que hasta ahora no he podido realizarlo. Ojala me puedas ayudar