none
Utilizar EF para el login en una aplicacion MVC5? RRS feed

  • Pregunta

  • Hola gente:

    Perdonar la pregunta de novato, quiero hacer una aplicación web con EF 6 con una base de datos SQL Server y MVC 5, pero no quiero utilizar nada mas, es decir, no quiero usar la base de datos local "default" que genera el asistente, ni para el login.

    En concreto para el login quiero usar mi base de datos, tampoco quiero usar métodos externos (google, Facebook,etc)

    He mirado varios tutoriales de como añadir el EF al modelo de datos pero para los usuarios no he visto como utilizar EF.

    Como lo puedo hacer?

    Muchas gracias


    Juanjo

    sábado, 26 de abril de 2014 19:04

Respuestas

  • Ah, releyendo tu mensaje veo que hablas de insertar a mano un usuario en AspNetUsers. Supongo que quieres hacer tu el insert y luego que sea membership/identity quien valide el usuario. No hagas eso.

    Si usas membership/identity usalo para todo: tanto para crear usuarios como para validar.

    En Membership crear un usuario es muy fácil. Basta con llamar a Membership.CreateUser. Para validar el usuario te basta con Membership.ValidateUser.

    Si usas Identity debes llamar al método CreateAsync del UserManager

    Y para validarlo el método FindAsync del UserManager.

    Insisto en que, dado que es un proyecto nuevo y usas MVC5, vayas por Identity y te olvides de Membership. Es cierto que Identity es más complejo de configurar y de entender pero es mucho más potente, versátil que Membership. Echa un vistazo a http://www.asp.net/identity

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta Juanjo_16v jueves, 8 de mayo de 2014 13:30
    lunes, 5 de mayo de 2014 9:36

Todas las respuestas

  • podrias crear una clase custom que implemente las de asp.net membership para implementar la autenticacion

    desde esas clases podrias utilizar EF

    https://www.nuget.org/packages/EFMembership/

    la base de datos puedes usar la que tu quieras y como la definas en el contexto de EF, peor la implementacion de las clases de asp.net membership es necesaria para poder confeccionar el login

    tambien podrias evaluar usar SimpleMembership de forma custom

     Customize the SimpleMembership in ASP.NET MVC 4.0

    solo es una clase que hereda de  SimpleMembershipProvider y alli implementas el login accediando a las tablas de usuario y roles que definas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 26 de abril de 2014 20:22
  • muchas gracias por las sugerencias, voy a mirar.

    Juanjo

    domingo, 27 de abril de 2014 7:33
  • NO.

    Está hablando explícitamente de MVC5. Nada de Membership. Está (por fin!) obsoleto en MVC5. Se debe usar el nuevo ASP.NET Identity.

    Además en ningún momento @Juanjo comente que el esquema de BBDD no le sirva. Tan solo que no quiere usar proveedores externos y que desea usar SQL Server en lugar de LocalDb. Incluso usando Membership (que insisto: está obsoleto) puede hacerse esto sin necesidad de implementar un custom membership provider.

    Asumiendo que has creado tu aplicación con el template de proyecto ASP.NET Web Application -> MVC entonces:

    Para usar SQL Server en lugar de LocalDb simplemente ve al web.config y cambia la cadena de conexión. Por defecto será algo como:

    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication11-20140428125033.mdf;Initial Catalog=aspnet-WebApplication11-20140428125033;Integrated Security=True" providerName="System.Data.SqlClient" />

    Cambialo para que en lugar de usar LocalDb use SQL Server Express... P. ej.:

    <add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=MyDatabase;Integrated Security="True" providerName="System.Data.SqlClient" />

    Con esto ya se usará la BBDD "MyDatabase" de tu servidor SQL Server Express.

    Si no quieres usar proveedores externos, limítate a eliminar el código correspondiente de Account Controller, especialmente los métodos: Disassociate, ExternalLogin, ExternalLoginCallback, LinkLogin, LinkLoginCallback, ExternalLoginConfirmation, ExternalLoginFailure.

    Deberás eliminar también las vistas asociadas.

    Otra opción es empezar de un template "Empty" de aplicación web y añadir a mano tan solo el soporte para usuarios internos, pero es más sencillo hacerlo a la inversa ;)

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    lunes, 28 de abril de 2014 10:58
  • Hola,

    Gracias a los dos. Las dos soluciones me sirven.

    Por un lado, no quería usar una base de datos local. Investigando, resulta que si cambias la cadena de conexión, te genera las tablas de la gestión de usuario en la base de datos destino.

    Por otro lado, quiero personalizar las tablas de la gestión de usuarios, no quiero que se autentifiquen con Facebook, twiter,etc..Ni siquiera quiero que se puedan registrar, quiero hacer yo la gestión de usuarios. Realmente solo me haría falta una tabla de usuarios, pero como comentais es mas fácil quitar funcionalidades que empezar de cero.

    Ahora tengo el problema... si inserto un usuario en la tabla AspNetUser, como se encripta la contraseña? porque si la meto como texto tal cual luego me da error al autentificar, y necesito poder gestionar las contresañas, al menos generarlas

    Saludos


    Juanjo

    sábado, 3 de mayo de 2014 7:44
  • Buenas!

    Si usas los métodos de Membership/Identity (hayas elegido el sistema que hayas elegido), el password se encripta solo.

    Si quieres encriptarlo tu, utiliza:

    var hashed = Crypto.HashPassword(password);

    Realmente el password está hasheado no encriptado. La diferencia entre un hash y una encriptación es que el primero no es reversible, es decir no se puede obtener el password a partir del hash. Por lo tanto cuando recibas el password del usuario debes mirar comparar los hashes. Para ello no calcules el hash de nuevo y lo compares con el de la BBDD. En lugar de eso, utiliza:

    var pwdOK = Crypto.VerifyHashedPassword(hash, pwd);

    La variable pwd contiene el password que ha entrado el usuario en el login (tal cual) y la variable hash el hash del password que tienes almacenado en la BBDD.

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    lunes, 5 de mayo de 2014 9:22
  • Ah, releyendo tu mensaje veo que hablas de insertar a mano un usuario en AspNetUsers. Supongo que quieres hacer tu el insert y luego que sea membership/identity quien valide el usuario. No hagas eso.

    Si usas membership/identity usalo para todo: tanto para crear usuarios como para validar.

    En Membership crear un usuario es muy fácil. Basta con llamar a Membership.CreateUser. Para validar el usuario te basta con Membership.ValidateUser.

    Si usas Identity debes llamar al método CreateAsync del UserManager

    Y para validarlo el método FindAsync del UserManager.

    Insisto en que, dado que es un proyecto nuevo y usas MVC5, vayas por Identity y te olvides de Membership. Es cierto que Identity es más complejo de configurar y de entender pero es mucho más potente, versátil que Membership. Echa un vistazo a http://www.asp.net/identity

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta Juanjo_16v jueves, 8 de mayo de 2014 13:30
    lunes, 5 de mayo de 2014 9:36
  • Muchas gracias, voy a ello

    Juanjo

    jueves, 8 de mayo de 2014 13:30