Estoy desarrollando una aplicación ASP.NET MVC 5. Tengo una base de datos existente, a partir de la cual creé mi modelo de datos de entidad ADO.NET. Tengo una tabla en esa base de datos que contiene la columna "nombre de usuario" y "contraseña", y quiero usarlas para implementar la autenticación y autorización en mi aplicación web; No puedo crear ninguna otra base de datos, tabla o columna y no puedo usar la autenticación de identidad estándar debido a los requisitos del cliente. No necesito administrar el registro, el cambio de contraseña u otras cosas: solo inicie sesión con contraseña y nombre de usuario. ¿Cómo puedo hacer eso?
Sí tu puedes. Las partes de autenticación y autorización funcionan de forma independiente. Si tiene su propio servicio de autenticación, puede usar la parte de autorización de OWIN. Considere que ya tiene un UserManager que valida el nombre de username y 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 }