Estoy sorprendido de cómo no he podido encontrar un ejemplo claro de cómo autenticar a un usuario desde la pantalla de inicio de sesión hasta usar el atributo Autorizar sobre mis métodos ApiController después de varias horas de Google.
Eso es porque te estás confundiendo acerca de estos dos conceptos:
La autenticación es el mecanismo por el cual los sistemas pueden identificar de forma segura a sus usuarios. Los sistemas de autenticación proporcionan respuestas a las preguntas:
- Quien es el usuario?
- ¿Es realmente el usuario quien se representa a sí mismo?
La autorización es el mecanismo por el cual un sistema determina qué nivel de acceso debe tener un usuario autenticado en particular para asegurar los recursos controlados por el sistema. Por ejemplo, un sistema de gestión de bases de datos podría diseñarse para proporcionar a ciertas personas específicas la capacidad de recuperar información de una base de datos pero no la capacidad de cambiar los datos almacenados en la base de datos, mientras que les da a otras personas la capacidad de cambiar datos. Los sistemas de autorización proporcionan respuestas a las preguntas:
- ¿El usuario X está autorizado para acceder al recurso R?
- ¿El usuario X está autorizado para realizar la operación P?
- ¿El usuario X está autorizado para realizar la operación P en el recurso R?
El Authorize
atributo en MVC se usa para aplicar reglas de acceso, por ejemplo:
[System.Web.Http.Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
return View();
}
La regla anterior permitirá solo usuarios en el Administrador y Súper Usuario roles de accedan al método
Estas reglas también se pueden establecer en el archivo web.config, utilizando el location
elemento Ejemplo:
<location path="Home/AdministratorsOnly">
<system.web>
<authorization>
<allow roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
Sin embargo, antes de ejecutar esas reglas de autorización, debe autenticarse en el sitio web actual .
Aunque estos explican cómo manejar solicitudes no autorizadas, no demuestran claramente algo como un LoginController o algo así para solicitar credenciales de usuario y validarlas.
A partir de aquí, podríamos dividir el problema en dos:
Autentique a los usuarios cuando consuman los servicios de API web dentro de la misma aplicación web
Este sería el enfoque más simple, porque confiaría en la autenticación en ASP.Net
Este es un ejemplo simple:
Web.config
<authentication mode="Forms">
<forms
protection="All"
slidingExpiration="true"
loginUrl="account/login"
cookieless="UseCookies"
enableCrossAppRedirects="false"
name="cookieName"
/>
</authentication>
Los usuarios serán redirigidos a la cuenta / ruta de inicio de sesión , allí representaría controles personalizados para solicitar credenciales de usuario y luego configuraría la cookie de autenticación usando:
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
Autenticación multiplataforma
Este caso sería cuando solo exponga servicios de API web dentro de la aplicación web, por lo tanto, tendría otro cliente consumiendo los servicios, el cliente podría ser otra aplicación web o cualquier aplicación .Net (Win Forms, WPF, consola, servicio de Windows, etc)
Por ejemplo, suponga que consumirá el servicio API web de otra aplicación web en el mismo dominio de red (dentro de una intranet), en este caso podría confiar en la autenticación de Windows proporcionada por ASP.Net.
<authentication mode="Windows" />
Si sus servicios están expuestos en Internet, deberá pasar los tokens autenticados a cada servicio de API web.
Para más información, echa un vistazo a los siguientes artículos: