Biblioteca IdentityModel para OAuth 2.0 y OpenID Connect en C# (.NET)
\n\nAl desarrollar aplicaciones web modernas, clientes móviles o API de servidor en la plataforma .NET, casi siempre surge la necesidad de integrarse con proveedores de autenticación externos (Google, GitHub, Microsoft, etc.) o con un servidor de autorización propio. IdentityModel es una biblioteca ligera pero potente para C# que proporciona un cliente OAuth conveniente para trabajar con los protocolos OAuth 2.0 y OpenID Connect. Es el estándar de facto en el ecosistema .NET para implementar flujos de autorización.
\n\nEn este artículo, analizaremos en detalle cómo usar IdentityModel para crear un cliente OAuth, obtener tokens de acceso y renovarlos. Los ejemplos de código estarán en C# (.NET 6+).
\n\nInstalación y configuración
\n\nPara comenzar, instale el paquete a través del NuGet Package Manager:
\n\ndotnet add package IdentityModel\n\nO a través de la consola del administrador de paquetes:
\n\nInstall-Package IdentityModel\n\nDespués de la instalación, tendrá acceso a las clases de extensiones de HttpClient, DiscoveryClient, TokenClient y otras utilidades auxiliares.
Escenario básico: obtención de token mediante Client Credentials
\n\nEste flujo se utiliza para la autenticación servidor a servidor, cuando el cliente (su aplicación) solicita un token en su propio nombre, no en el de un usuario.
\n\nEjemplo de configuración de un cliente OAuth:
\n\nusing IdentityModel.Client;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\npublic async Task<string> GetAccessTokenAsync()\n{\n var client = new HttpClient();\n\n // 1. Obtener el documento de descubrimiento (discovery) del servidor de autorización\n var disco = await client.GetDiscoveryDocumentAsync("https://your-auth-server.com");\n if (disco.IsError)\n {\n throw new Exception($"Error al obtener discovery: {disco.Error}");\n }\n\n // 2. Solicitar el token usando client_id y client_secret\n var tokenResponse = await client.RequestClientCredentialsTokenAsync(\n new ClientCredentialsTokenRequest\n {\n Address = disco.TokenEndpoint,\n ClientId = "your-client-id",\n ClientSecret = "your-client-secret",\n Scope = "api1 api2" // permisos solicitados\n });\n\n if (tokenResponse.IsError)\n {\n throw new Exception($"Error al obtener token: {tokenResponse.Error}");\n }\n\n return tokenResponse.AccessToken;\n}\n\nEn este ejemplo, usamos métodos de extensión del espacio de nombres IdentityModel.Client. La biblioteca maneja automáticamente la serialización JSON, los encabezados y el análisis de respuestas.
Flujo de Código de Autorización (con participación del usuario)
\n\nPara aplicaciones con interfaz de usuario (ASP.NET Core MVC, Blazor, escritorio), se usa más frecuentemente el código de autorización. IdentityModel se integra con Microsoft.AspNetCore.Authentication.OpenIdConnect, pero también proporciona herramientas de bajo nivel para una implementación manual.
Ejemplo de obtención de token después de la redirección con código:
\n\npublic async Task<TokenResponse> ExchangeCodeForTokenAsync(string authorizationCode, string redirectUri)\n{\n var client = new HttpClient();\n var disco = await client.GetDiscoveryDocumentAsync("https://your-auth-server.com");\n\n var tokenResponse = await client.RequestAuthorizationCodeTokenAsync(\n new AuthorizationCodeTokenRequest\n {\n Address = disco.TokenEndpoint,\n ClientId = "your-client-id",\n ClientSecret = "your-client-secret",\n Code = authorizationCode,\n RedirectUri = redirectUri\n });\n\n return tokenResponse;\n}\n\nRenovación de token (Refresh Token)
\n\nLos access tokens generalmente tienen una vida corta (por ejemplo, 1 hora).