Introducción a OAuth 2.0 y JWT en C#
\nLas aplicaciones web modernas requieren mecanismos de seguridad robustos. Dos protocolos clave — OAuth 2.0 y JWT (JSON Web Token) — se han convertido en el estándar de facto para implementar autorización y autenticación. En este artículo, analizaremos cómo utilizar estas tecnologías en el ecosistema C# (.NET).
\nOAuth 2.0 es un protocolo de acceso delegado que permite a las aplicaciones obtener acceso limitado a los recursos del usuario sin transferir sus credenciales. JWT, por su parte, es un formato de token compacto y autónomo que se utiliza a menudo para transmitir información de autenticación entre el cliente y el servidor.
\nEn esta guía, crearemos una API web simple en ASP.NET Core que implementa OAuth 2.0 utilizando tokens JWT. Aprenderá cómo configurar la generación, validación y protección de endpoints.
\n\n¿Qué son OAuth 2.0 y JWT?
\nAntes de pasar al código, analicemos los conceptos principales.
\nOAuth 2.0
\nOAuth 2.0 define cuatro roles:
\n- \n
- Resource Owner (propietario del recurso) — generalmente el usuario. \n
- Client (cliente) — la aplicación que desea obtener acceso. \n
- Authorization Server (servidor de autorización) — emite los tokens. \n
- Resource Server (servidor de recursos) — proporciona datos protegidos. \n
El flujo principal Authorization Code Grant incluye: redirigir al usuario al servidor de autorización, obtener un código, intercambiar el código por un token de acceso.
\n\nJWT (JSON Web Token)
\nJWT consta de tres partes separadas por puntos:
\n- \n
- Header — tipo de token y algoritmo de firma (por ejemplo, HS256). \n
- Payload — datos (claims), como ID de usuario, rol, fecha de expiración. \n
- Signature — firma creada con una clave secreta. \n
Ejemplo de JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Configuración del proyecto ASP.NET Core
\nCrearemos un nuevo proyecto de API web con soporte de autenticación.
\ndotnet new webapi -n OAuthJwtDemo\ncd OAuthJwtDemo\nAgreguemos los paquetes NuGet necesarios:
\ndotnet add package Microsoft.AspNetCore.Authentication.JwtBearer\ndotnet add package System.IdentityModel.Tokens.Jwt\n\nConfiguración en appsettings.json
\nAgregue una sección para la configuración JWT en el archivo appsettings.json:
{\n "JwtSettings": {\n "SecretKey": "YOUR_SUPER_SECRET_KEY_AT_LEAST_32_CHARS",\n "Issuer": "OAuthJwtDemo",\n "Audience": "OAuthJwtDemoClient",\n "ExpirationMinutes": 60\n }\n}\nImportante: En un proyecto real, almacene la clave secreta en User Secrets o Azure Key Vault.
\n\nImplementación del servicio de generación de JWT
\nCrearemos una interfaz y su implementación para trabajar con tokens.
\nInterfaz IJwtService
\npublic interface IJwtService\n{\n string GenerateToken(string userId, string role);\n ClaimsPrincipal ValidateToken(string token);\n}\n\nImplementación de JwtService
\npublic class JwtService : IJwtService\n{\n private readonly JwtSettings _settings;\n\n public JwtService(IOptions<JwtSettings> settings)\n {\n _settings = settings.Value;\n }\n\n public string GenerateToken(string userId, string role)\n {\n var claims = new[]\n {\n new Claim(ClaimTypes.NameIdentifier, userId),\n new Claim(ClaimTypes.Role, role),\n new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())\n };\n\n var key = new Symmetric