Cliente OAuth para C# (.NET): biblioteca IdentityModel e integração com OAuth 2.0

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Biblioteca IdentityModel para OAuth 2.0 e OpenID Connect em C# (.NET)

\n\n

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

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

Instalação e configuração

\n\n

Para começar, instale o pacote via NuGet Package Manager:

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

Ou através do console do gerenciador de pacotes:

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

Após a instalação, você terá acesso às classes de extensão HttpClient, DiscoveryClient, TokenClient e outros utilitários auxiliares.

\n\n

Cenário básico: obtenção de token via Client Credentials

\n\n

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

Exemplo de configuração do 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. 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\n

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

\n\n

Fluxo Authorization Code (com participação do usuário)

\n\n

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

\n\n

Exemplo de obtenção de token após redirecionamento com o 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

Renovação de token (Refresh Token)

\n\n

Os access tokens geralmente têm vida curta (por exemplo, 1 hora).

Recommendations