Integrar o Auth0.NET ao seu projeto enquanto segue as convenções idiomáticas do .NET pode ser complicado e envolver uma quantidade considerável de clichês compartilhados entre projetos.
Esta biblioteca espera resolver esse problema, apresentando:
Extensões para Microsoft.Extensions.DependencyInjection
.
Cache e renovação automática de token de acesso para a API de gerenciamento e seus próprios serviços REST e Grpc
Integração HttpClientFactory para extensibilidade centralizada e gerenciamento dos manipuladores HTTP internos.
Extensões IHttpClientBuilder
, fornecendo manipuladores para anexar automaticamente tokens de acesso a solicitações de saída.
Essa biblioteca é compatível com todos os tempos de execução do .NET Standard 2.0 (recomendado .NET 8+) e é adequada para uso em aplicativos ASP.NET Core e .NET Generic Host autônomos.
Adicione Auth0Net.DependencyInjection
ao seu projeto:
Install-Package Auth0Net.DependencyInjection
Se você estiver simplesmente usando AuthenticationApiClient
e nada mais, poderá chamar AddAuth0AuthenticationClientCore
e passar seu domínio Auth0. Esta integração é leve e não oferece suporte a nenhum outro recurso desta biblioteca.
services . AddAuth0AuthenticationClientCore ( "your-auth0-domain.auth0.com" ) ;
Você pode então solicitar o IAuthenticationApiClient
dentro da sua classe:
public class AuthController : ControllerBase
{
private readonly IAuthenticationApiClient _authenticationApiClient ;
public AuthController ( IAuthenticationApiClient authenticationApiClient )
{
_authenticationApiClient = authenticationApiClient ;
}
Adicione AuthenticationApiClient
com AddAuth0AuthenticationClient
e forneça uma configuração de aplicativo máquina a máquina que será consumida pelas integrações Management Client, Token Cache e IHttpClientBuilder. Esta extensão deve ser chamada antes de usar qualquer outra extensão nesta biblioteca:
services . AddAuth0AuthenticationClient ( config =>
{
config . Domain = builder . Configuration [ "Auth0:Domain" ] ;
config . ClientId = builder . Configuration [ "Auth0:ClientId" ] ;
config . ClientSecret = builder . Configuration [ "Auth0:ClientSecret" ] ;
} ) ;
Adicione o ManagementApiClient
com AddAuth0ManagementClient()
e adicione o DelegatingHandler
com AddManagementAccessToken()
que anexará o token de acesso automaticamente:
services . AddAuth0ManagementClient ( ) . AddManagementAccessToken ( ) ;
Certifique-se de que seu aplicativo Machine-to-Machine esteja autorizado a solicitar tokens da API de gerenciamento e tenha os escopos corretos para os recursos que você deseja usar.
Você pode então solicitar o IManagementApiClient
(ou IAuthenticationApiClient
) em seus serviços:
public class MyAuth0Service : IAuth0Service
{
private readonly IManagementApiClient _managementApiClient ;
public MyAuth0Service ( IManagementApiClient managementApiClient )
{
_managementApiClient = managementApiClient ;
}
Se você estiver usando um domínio personalizado com seu locatário Auth0, poderá ter um problema em que o audience
da API de gerenciamento está sendo definido incorretamente. Você pode substituir isso por meio da propriedade Audience
:
services . AddAuth0ManagementClient ( )
. AddManagementAccessToken ( c =>
{
c . Audience = "my-tenant.au.auth0.com" ;
} ) ;
Observação: esse recurso depende de services.AddAuth0AuthenticationClient(config => ...)
ser chamado e configurado conforme descrito no cenário anterior.
Esta biblioteca inclui um manipulador de delegação - efetivamente um middleware para seu HttpClient - que anexará um token de acesso a todas as solicitações de saída. Isto é útil para chamar outros serviços protegidos pelo Auth0. Essa integração requer que sua implementação de serviço use IHttpClientFactory
como parte de seu registro. Você pode ler mais sobre isso aqui
Use AddAccessToken
junto com o público necessário:
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( builder . Configuration [ "MyHttpService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyHttpService:Audience" ] ) ;
Esta extensão é compatível com qualquer registro que retorne um IHttpClientBuilder
, portanto pode ser utilizada com a fábrica cliente do Grpc:
services . AddGrpcClient < UserService . UserServiceClient > ( x => x . Address = new Uri ( builder . Configuration [ "MyGrpcService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyGrpcService:Audience" ] ) ;
AddAccessToken
também tem uma opção para passar uma função que pode resolver o público em tempo de execução. Isso pode ser útil se o público esperado sempre seguir um padrão ou se você confiar na descoberta de serviços, como no Steeltoe.NET:
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( "https://MyServiceName/" ) )
. AddServiceDiscovery ( )
. AddAccessToken ( config => config . AudienceResolver = request => request . RequestUri . GetLeftPart ( UriPartial . Authority ) ) ;
Tanto os clientes de autenticação quanto os de autorização são registrados como singletons e são adequados para injeção em qualquer outro tempo de vida.
Um exemplo de Host Genérico .NET e ASP.NET Core estão disponíveis no diretório samples.
O Auth0TokenCache
armazenará em cache um token para um determinado público até pelo menos 95% do tempo de expiração. Se uma solicitação ao cache for feita entre 95% e 99% da expiração, o token será atualizado em segundo plano antes que a expiração seja atingida.
Um adicional de 1% da vida útil é removido para proteger contra desvios de clock entre sistemas distribuídos.
Em algumas situações, você pode querer solicitar manualmente um token de acesso do Auth0. Você pode conseguir isso injetando IAuth0TokenCache
em uma classe e chamando GetTokenAsync
com o público da API para a qual você está solicitando o token.
Uma instância somente na memória do FusionCache é usada como implementação de cache. Esta instância é nomeada e não afetará outros usos do FusionCache.
Esta biblioteca expõe uma extensão de string simples, ToHttpsUrl()
, que pode ser usada para formatar o domínio Auth0 nu em sua configuração em um URL adequado.
Isso é idêntico a https://{Configuration["Auth0:Domain"]}/
que você geralmente acaba escrevendo em algum lugar do seu Startup.cs
.
Por exemplo, formatando o domínio para a autoridade JWT:
. AddJwtBearer ( options =>
{
// "my-tenant.auth0.com" -> "https://my-tenant.auth0.com/"
options . Authority = builder . Configuration [ "Auth0:Domain" ] . ToHttpsUrl ( ) ;
//...
} ) ;
Não sou afiliado nem represento Auth0. Todos os problemas de implementação relacionados ao ManagementApiClient
e AuthenticationApiClient
subjacentes devem ir para o repositório oficial Auth0.NET.
Ícones usados sob a licença MIT do pacote Identicons.