Biblioteca IdentityModel para OAuth 2.0 e OpenID Connect em C# (.NET)
\n\nNo desenvolvimento de aplicações web modernas, clientes móveis ou APIs de servidor na plataforma .NET, quase sempre surge a necessidade de integração com provedores de autenticação externos (Google, GitHub, Microsoft, etc.) ou com seu próprio servidor de autorização. IdentityModel é uma biblioteca leve, mas poderosa, para C# que fornece um cliente OAuth conveniente para trabalhar com os protocolos OAuth 2.0 e OpenID Connect. Ela é o padrão de facto no ecossistema .NET para implementar fluxos de autorização.
\n\nNeste artigo, vamos detalhar como usar o IdentityModel para criar um cliente OAuth, obter tokens de acesso e renová-los. Os exemplos de código serão em C# (.NET 6+).
\n\nInstalação e configuração
\n\nPara começar, instale o pacote via NuGet Package Manager:
\n\ndotnet add package IdentityModel\n\nOu através do console do gerenciador de pacotes:
\n\nInstall-Package IdentityModel\n\nApós a instalação, você terá acesso às classes de extensão HttpClient, DiscoveryClient, TokenClient e outros utilitários auxiliares.
Cenário básico: obtenção de token via Client Credentials
\n\nEste fluxo é usado para autenticação servidor-a-servidor, quando o cliente (sua aplicação) solicita um token em nome próprio, e não de um usuário.
\n\nExemplo de configuração do 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. Obtém o documento de descoberta (discovery) do servidor de autorização\n var disco = await client.GetDiscoveryDocumentAsync("https://your-auth-server.com");\n if (disco.IsError)\n {\n throw new Exception($"Erro ao obter discovery: {disco.Error}");\n }\n\n // 2. Solicita o token usando client_id e 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" // permissões solicitadas\n });\n\n if (tokenResponse.IsError)\n {\n throw new Exception($"Erro ao obter token: {tokenResponse.Error}");\n }\n\n return tokenResponse.AccessToken;\n}\n\nNeste exemplo, usamos métodos de extensão do namespace IdentityModel.Client. A biblioteca lida automaticamente com a serialização JSON, cabeçalhos e análise das respostas.
Fluxo Authorization Code (com participação do usuário)
\n\nPara aplicações com interface de usuário (ASP.NET Core MVC, Blazor, desktop), o código de autorização é mais utilizado. O IdentityModel se integra com Microsoft.AspNetCore.Authentication.OpenIdConnect, mas também fornece ferramentas de baixo nível para implementação manual.
Exemplo de obtenção de token após redirecionamento com o 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\nRenovação de token (Refresh Token)
\n\nOs access tokens geralmente têm vida curta (por exemplo, 1 hora).