Cliente OAuth para C# (.NET): biblioteca IdentityModel e integración con OAuth 2.0

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Biblioteca IdentityModel para OAuth 2.0 y OpenID Connect en C# (.NET)

\n\n

Al 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\n

En 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\n

Instalación y configuración

\n\n

Para comenzar, instale el paquete a través del NuGet Package Manager:

\n\n
dotnet add package IdentityModel
\n\n

O a través de la consola del administrador de paquetes:

\n\n
Install-Package IdentityModel
\n\n

Después de la instalación, tendrá acceso a las clases de extensiones de HttpClient, DiscoveryClient, TokenClient y otras utilidades auxiliares.

\n\n

Escenario básico: obtención de token mediante Client Credentials

\n\n

Este 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\n

Ejemplo de configuración de un cliente OAuth:

\n\n
using 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\n

En 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.

\n\n

Flujo de Código de Autorización (con participación del usuario)

\n\n

Para 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.

\n\n

Ejemplo de obtención de token después de la redirección con código:

\n\n
public 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\n

Renovación de token (Refresh Token)

\n\n

Los access tokens generalmente tienen una vida corta (por ejemplo, 1 hora).

Recommendations