aspnet-core-autenticacion-vs-autorizacion-diferencias

Autenticación y autorización en ASP.NET Core

  • 3 min

La autenticación comprueba quién eres, mientras que la autorización decide qué puedes hacer con esa identidad.

Confundirlos lleva a errores de diseño graves (como devolver un error 401 cuando deberías devolver un 403) y a brechas de seguridad.

Vamos a separar con claridad las preguntas «¿quién eres?» y «¿qué puedes hacer?».

Diferencias principales

ConceptoPregunta claveCuándo ocurreSi falla devuelve…
Autenticación (AuthN)¿Quién eres?Al principio (Login)401 Unauthorized
Autorización (AuthZ)¿Qué puedes hacer?Después del Login403 Forbidden

Autenticación (AuthN): identidad

La Autenticación (a menudo abreviada como AuthN) es el proceso de verificar la identidad de un usuario o servicio.

Responde a la pregunta: “¿Eres quien dices ser?”.

Es el portero de la discoteca pidiéndote el DNI. No le importa si vas a beber agua o champán, solo quiere saber si la foto del DNI coincide con tu cara y si el documento es válido.

Ejemplos de Autenticación:

  • Introducir usuario y contraseña en un formulario de Login.
  • Usar la huella dactilar (Biometría) para desbloquear el móvil.
  • Enviar una API Key en la cabecera de una petición.
  • Iniciar sesión con Google, Microsoft u otro proveedor externo.

El resultado de una autenticación exitosa es una Identidad (un Usuario, un Token, una Cookie) que el sistema reconoce.

Autorización (AuthZ): permisos

La Autorización (abreviada como AuthZ) ocurre después de la autenticación. Es el proceso de verificar si esa identidad tiene permiso para realizar una acción concreta.

Responde a la pregunta: “¿Tienes permiso para hacer esto?”.

Siguiendo con la analogía de la discoteca: ya estás dentro (te has autenticado). Ahora intentas entrar a la zona VIP. El seguridad te para y mira si tienes la pulsera VIP. Saben quién eres, pero quizás no tienes permiso para estar en esa zona.

Ejemplos de Autorización:

  • “¿Puede el usuario ‘Luis’ borrar este artículo?”
  • “¿Tiene este usuario el rol de ‘Administrador’?”
  • “¿Tiene esta App permiso para acceder a mi cámara?”

Códigos de estado: 401 y 403

En el protocolo HTTP, esta diferencia se refleja en dos códigos de estado que suelen confundirse:

Indica que la petición necesita autenticación o que las credenciales enviadas no son válidas.

  • Causa: No has enviado el token, o el token ha caducado.
  • Solución: Haz login de nuevo.
  • Significa: “Sé quién eres, pero NO te dejo pasar”.
  • Causa: Estás logueado como “Usuario Normal” e intentas acceder a una ruta de “Admin”.
  • Solución: pide más permisos o usa una cuenta con el rol correcto.

El flujo en ASP.NET Core

En nuestros artículos anteriores sobre Middleware, vimos este orden en Program.cs:

var app = builder.Build();

// ... otros middlewares ...

app.UseAuthentication(); // 1. ¿Quién eres? (AuthN)
app.UseAuthorization();  // 2. ¿Puedes pasar? (AuthZ)

app.MapControllers();
Copied!

El orden es importante.

  1. UseAuthentication: Intenta construir un User (ClaimsPrincipal) a partir de la cookie o el token que viene en la petición. Si lo consigue, lo guarda en HttpContext.User.
  2. UseAuthorization: Mira el HttpContext.User. Si el endpoint tiene un atributo [Authorize(Roles = "Admin")], comprueba si ese usuario tiene ese rol.

Ejemplo en código

[Authorize] // 1. Requiere Autenticación (Cualquiera con usuario válido entra)
public class DocumentosController : ControllerBase
{
    [HttpGet]
    public IActionResult Leer() => Ok("Documento público para usuarios");

    [Authorize(Roles = "Admin")] // 2. Requiere Autorización específica (Solo admins)
    [HttpDelete]
    public IActionResult Borrar() => Ok("Documento borrado");
}
Copied!
  • Si entra un anónimo a Leer() -> 401 Unauthorized.
  • Si entra un usuario normal a Leer() -> 200 OK.
  • Si entra un usuario normal a Borrar() -> 403 Forbidden.