route - web forms c#
Cómo implementar la autenticación personalizada en ASP.NET MVC 5 (1)
Estoy desarrollando una aplicación ASP.NET MVC 5. Tengo una base de datos existente, desde 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 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 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 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 el
username
y la
password
.
Por lo tanto, puede escribir el siguiente código en su acción de inicio de sesión posterior a la publicación:
[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
}