Client OAuth pour C# (.NET) : bibliothèque IdentityModel et intégration OAuth 2.0

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Bibliothèque IdentityModel pour OAuth 2.0 et OpenID Connect en C# (.NET)

\n\n

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

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

Installation et configuration

\n\n

Pour commencer, installez le package via NuGet Package Manager :

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

Ou via la console du gestionnaire de packages :

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

Après installation, vous avez accès aux classes d'extension HttpClient, DiscoveryClient, TokenClient et à d'autres utilitaires.

\n\n

Scénario de base : obtention d'un jeton via Client Credentials

\n\n

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

Exemple de configuration d'un client 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. 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\n

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

\n\n

Flux Authorization Code (avec participation de l'utilisateur)

\n\n

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

\n\n

Exemple d'obtention d'un jeton après redirection avec le code :

\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

Renouvellement du jeton (Refresh Token)

\n\n

Les jetons d'accès (Access tokens) ont généralement une durée de vie courte (par exemple, 1 heure).

Recommendations