hacer un loggin en MVC3 con C# y SQL Server 2008
-
12 aprilie 2012 17:03
hola, buen dia
Actualmente me encuentro haciendo una pagina en MVC 3 con C# y ASP.NET conectándome a una Base de Datos de SQL Server 2008, ya logre traerme información de una tabla y mostrarla en un GridView con diseño y todo eso pero ahora quiero hacer un Loggin para usuario, estuve checando los ejemplos que tiene MVC 3 que genera por default para hacer nuestros 1eros proyectos, tengo la idea pero no se como acomodarla, si pudieran ayudarme se los agradeceria mucho.
tengo una clase en /Models donde hago la conexión a la Base de Datos con un LinQ to SQL y dentro de la clase Modelo.cs tengo 2 métodos que lo que hacen es traerme la información (que dije anteriormente), agregue otra tabla de Nombre Usuarios que yo mismo llene con datos para poder hacer la consulta.
Cree un controlador llamado AccountController, como los que trae los ejemplos de MVC3 pero hasta ahi me quede.
ahora no se como hacer esa consulta para que pueda checar si es el usuario que tiene la Tabla, si alguien podría ayudarme se lo agradecería mucho.
Gracias
Toate mesajele
-
12 aprilie 2012 23:57
Hola,
No te quedes en eso que eso es un mundo bonito y da para muchas cosas. Lo primero que te recomiendo es que tengas claro lo siguiente.
http://msdn.microsoft.com/es-es/library/1b9hw62f(v=vs.80).aspx
Que en el fondo es en lo que se basas MVC para todo el tema de autenticación.
Lo segundo es que evites hacer login en cada RoundTrip y que también evites guardar datos en sesion. Para ello te recomiendo el siguiente enlace de un buen compañero.
http://geeks.ms/blogs/etomas/archive/2010/12/16/asp-net-obtener-el-id-del-usuario-actual.aspx
Casí seguro que consigues que tus app sean un poco más fluidas.
-
13 aprilie 2012 07:30
Buenas!!
Gracias por la referencia Pedro! ;-)
Ahora, sobre el Membership Provider yo cada vez estoy más convencido de NO usarlo en ASP.NET MVC. Es un tema que da para mucho y en el grupo de Linkedin de AUGES tuvimos una discusión sobre esto al respecto: http://www.linkedin.com/groups/Usar-no-usar-modelo-Membership-3889150.S.72871332?qid=3e03dddc-89ea-4d7a-bef1-7e8f34b680b8&trk=group_most_popular-0-b-ttl&goback=%2Egmp_3889150
Mis razones para no usar el Membership Provider en ASP.NET MVC (especialmente las dos primeras):
- Está super-hinchado. Por norma general terminas implementando solo N métodoes y dejando los otros M (y generalmente M>N) con el throw NotImplemented. Es lo más anti YAGNI que te puedas tirar a la cara.
- No aporta NADA a ASP.NET MVC. Está pensado para Webforms donde el control Login y similares lo usan para toda su funcionalidad. Pero en MVC? Nadie lo usa, a no ser que lo uses tu explícitamente. Y la pregunta es ¿por que?
- Es dificil inyectarle dependencias al Membership Provider. Aunque poder, se puede.
Así, que en mi opinión, es mucho más práctico, sencillo y rápido hacerte tu propio método en el modelo que acceda a tu base de datos y termine comprobando las credenciales. Lo que tiene que quedar claro es que autenticar NO autentica el Membership. Autenticar es llamar a SetAuthCookie (http://msdn.microsoft.com/es-es/library/system.web.security.formsauthentication.setauthcookie(v=vs.100).aspx) y esto lo hará tu AccountController con una llamada tipo:
if (myUsersDao.CheckUserCredentials(login, pwd) == true) { // usuario autenticado FormsAuthentication.SetAuthCookie(login, false); return RedirectToAction("Index","Home"); }Y ni Membership Provider ni nada...
Dicho esto, @jazo no termino de entender tu pregunta...
- Si era sobre como autenticar el usuario, ya sabes con SetAuthCookie generas y envías la cookie de autenticación
- Si es sobre como evitar que el usuario NO autenticado acceda a secciones "privadas" de la app, esto es añadiendo [Authorize] en las acciones de los controladores que son privadas. O bien comprobándolo por código (Request.IsAuthenticated).
- Si es sobre como usar Linq2Sql para generar el Select por norma general basta algo como:
public bool CheckUserCredentials (string login, string password) { var bd = new UsuariosDataContext(); var usuario = bd.Usuarios.FirstOrDefault(x=>x.Login == login && x.Pwd == password); return usuario != null; }El código exacto dependerá por supuesto de como sea tu modelo de Linq2Sql :)
Saludos!
Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
-
13 aprilie 2012 22:27
Hola Eduard,
Coindico plemamente con lo que comentas. Es más jamas en la vida lo he utilizado, hasta hace unos días:) y no lo voy a hacer mas. Eso de complicarte la vida con cosas que no te aportan nada hace tiempo que decidí no hacerlo.
Pase esas referencias, por dos razones.
La tuya ne parece buenísima y la otra porque por desgracia estamos heredando en MVC cosas de ASP.NET y que jamas se deberían de haber implementado, pero claro eso es como decir matalo:). Que quiza sería una buena opción y a veces hay que ser diplomático;).
Saludos
-
19 aprilie 2012 00:06
hola, buenas tardes
tngo en mi Clase Modelo un metodo de la siguiente forma:
public static bool ValidateUser(string UsersName, string pass)
{
string variable = (from UserName in DB.Users where UserName.Username == UsersName && UserName.Password==pass select UserName).ToString();
if (variable != null)
{
return true;
}
return false;
}Lo que pretendo hacer es que valide los usuarios con sus passwords, pero creo que no he podido hacer que lo valide, ahi lo que hace es agregar datos a la variable string y con eso valido si esta nulo o no, cosa que no quiero ya que si pongo otro usuario que no este en la tabla de SQL comoquiera entra y valida, si pudieran ayudarme a definir mas ese metodo ya que me trae loco jejejeje xfa
saludos!
-
19 aprilie 2012 06:24
Buenas!
Quita el .ToString() final
Con este .ToString() no estás conviertiendo a cadena el nombre de usuario si no la query entera (que al final es un IEnumerable<string>).
Además, el resultado que tienes en variable NO es una string, es una consulta, que puede tener cero, uno o más resultados (ya, tu sabes que la combinación login/pwd es unica, pero la BBDD eso no lo sabe).
Por lo tanto, usa:
var consulta = (from UserName in DB.Users where UserName.Username == UsersName && UserName.Password==pass select UserName; return consulta.Any();
Con eso devuelves si hay algún registro en la BBDD (consulta.Any()).
No lo he probado, pero creo que así te debería funcionar (aunque no se si es la manera más óptima de hacer la query).
Saludos!
Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
- Propus ca răspuns de jtorrecillaMVP 19 aprilie 2012 06:58
- Marcat ca răspuns de jfThumbus 25 aprilie 2012 16:21
-
25 aprilie 2012 16:21
Correcto!!...
si Valido los usuarios y si no existe me manda el mensaje de Error... MUCHAS GRACIAS!!!
Diste en el Punto, Gracias y Saludos...