Bibliothèque IdentityModel pour OAuth 2.0 et OpenID Connect en C# (.NET)
\n\nLors du développement d'applications web modernes, de clients mobiles ou d'API serveur sur la plateforme .NET, il est presque toujours nécessaire d'intégrer des fournisseurs d'authentification externes (Google, GitHub, Microsoft, etc.) ou votre propre serveur d'autorisation. IdentityModel est une bibliothèque légère mais puissante pour C#, qui fournit un client OAuth pratique pour travailler avec les protocoles OAuth 2.0 et OpenID Connect. Elle est de facto la norme dans l'écosystème .NET pour implémenter les flux d'autorisation.
\n\nDans cet article, nous allons détailler comment utiliser IdentityModel pour créer un client OAuth, obtenir des jetons d'accès et les renouveler. Les exemples de code seront en C# (.NET 6+).
\n\nInstallation et configuration
\n\nPour commencer, installez le package via NuGet Package Manager :
\n\ndotnet add package IdentityModel\n\nOu via la console du gestionnaire de packages :
\n\nInstall-Package IdentityModel\n\nAprès installation, vous avez accès aux classes d'extension HttpClient, DiscoveryClient, TokenClient et à d'autres utilitaires.
Scénario de base : obtention d'un jeton via Client Credentials
\n\nCe flux est utilisé pour l'authentification serveur à serveur, lorsque le client (votre application) demande un jeton en son propre nom, et non au nom d'un utilisateur.
\n\nExemple de configuration d'un client 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. Obtenir le document de découverte (discovery) du serveur d'autorisation\n var disco = await client.GetDiscoveryDocumentAsync("https://your-auth-server.com");\n if (disco.IsError)\n {\n throw new Exception($"Erreur lors de l'obtention du discovery : {disco.Error}");\n }\n\n // 2. Demander un jeton en utilisant client_id et 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" // permissions demandées\n });\n\n if (tokenResponse.IsError)\n {\n throw new Exception($"Erreur lors de l'obtention du jeton : {tokenResponse.Error}");\n }\n\n return tokenResponse.AccessToken;\n}\n\nDans cet exemple, nous utilisons les méthodes d'extension de l'espace de noms IdentityModel.Client. La bibliothèque gère automatiquement la sérialisation JSON, les en-têtes et l'analyse des réponses.
Flux Authorization Code (avec participation de l'utilisateur)
\n\nPour les applications avec interface utilisateur (ASP.NET Core MVC, Blazor, desktop), le code d'autorisation est plus souvent utilisé. IdentityModel s'intègre avec Microsoft.AspNetCore.Authentication.OpenIdConnect, mais fournit également des outils de bas niveau pour une implémentation manuelle.
Exemple d'obtention d'un jeton après redirection avec le code :
\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\nRenouvellement du jeton (Refresh Token)
\n\nLes jetons d'accès (Access tokens) ont généralement une durée de vie courte (par exemple, 1 heure).
Aussi dans la bibliothèque
Traitement des images en PHP : redimensionnement, recadrage et optimisation avec GD et Imagick
Envoi de SMS en Java : aperçu des bibliothèques API (Twilio, Nexmo, passerelles SMS)
Elasticsearch .NET pour C# : guide complet avec exemples
Rate Limiting en Swift : Limitation du taux de requêtes pour iOS et macOS
Géolocalisation et cartes en TypeScript : bibliothèques, API et exemples de code