Cómo implementar autenticación personalizada en ASP.NET MVC 5

Estoy desarrollando una aplicación ASP.NET MVC 5. Tengo un DB existente, desde el cual creé mi Modelo de Datos de Entidades ADO.NET. Tengo una tabla en ese DB que contiene la columna “nombre de usuario” y “contraseña”, y quiero usarlos para implementar autenticación y autorización en mi Webapp; No puedo crear ninguna otra base de datos o tabla o columna y no puedo usar la autenticación de identidad estándar, debido a los requisitos del cliente. No es necesario que administre el inicio de sesión, el cambio de contraseña u otras cosas: simplemente inicie sesión con la contraseña y el nombre de usuario. ¿Cómo puedo hacer eso?

Sí tu puedes. Las partes de Autenticación y Autorización funcionan de manera independiente. Si tiene su propio servicio de autenticación, puede simplemente usar la parte de autorización de OWIN. Considere que ya tiene un UserManager que valida el username y la password . Por lo tanto, puede escribir el siguiente código en su acción de inicio de sesión posterior:

 [HttpPost] public ActionResult Login(string username, string password) { if (new UserManager().IsValid(username, password)) { var ident = new ClaimsIdentity( new[] { // adding following 2 claim just for supporting default antiforgery provider new Claim(ClaimTypes.NameIdentifier, username), new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"), new Claim(ClaimTypes.Name,username), // optionally you could add roles if any new Claim(ClaimTypes.Role, "RoleName"), new Claim(ClaimTypes.Role, "AnotherRole"), }, DefaultAuthenticationTypes.ApplicationCookie); HttpContext.GetOwinContext().Authentication.SignIn( new AuthenticationProperties { IsPersistent = false }, ident); return RedirectToAction("MyAction"); // auth succeed } // invalid username or password ModelState.AddModelError("", "invalid username or password"); return View(); } 

Y su administrador de usuarios puede ser algo como esto:

 class UserManager { public bool IsValid(string username, string password) { using(var db=new MyDbContext()) // use your DbConext { // for the sake of simplicity I use plain text passwords // in real world hashing and salting techniques must be implemented return db.Users.Any(u=>u.Username==username && u.Password==password); } } } 

Al final, puede proteger sus acciones o controladores agregando un atributo Authorize .

 [Authorize] public ActionResult MySecretAction() { // all authorized users can use this method // we have accessed current user principal by calling also // HttpContext.User } [Authorize(Roles="Admin")] public ActionResult MySecretAction() { // just Admin users have access to this method }