Cómo implementar la autenticación personalizada en ASP.NET MVC 5
Estoy desarrollando un ASP.NET Aplicación MVC 5. Tengo una base de datos existente, a partir de la cual creé mi ADO.NET Modelo de Datos de Entidad. Tengo una tabla en esa base de datos que contiene la columna" nombre de usuario "y" contraseña", y quiero usarlos para implementar la autenticación y autorización en mi aplicación Web; 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 necesito administrar el registro, el cambio de contraseña u otras cosas: simplemente inicie sesión con contraseña y nombre de usuario. ¿Cómo puedo hacer eso?
1 answers
Sí, puedes. Las piezas 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 username
y password
. Por lo tanto, puede escribir el siguiente código en su acción de inicio de sesión post back:
[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
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-11 19:46:46