Integrar Auth0.NET en su proyecto mientras se siguen las convenciones idiomáticas de .NET puede ser engorroso e implicar una cantidad considerable de texto estándar compartido entre proyectos.
Esta biblioteca espera resolver ese problema, presentando:
Extensiones para Microsoft.Extensions.DependencyInjection
.
Almacenamiento en caché y renovación automática de tokens de acceso para la API de administración y sus propios servicios REST y Grpc
Integración de HttpClientFactory para extensibilidad y gestión centralizada de los controladores HTTP internos.
Extensiones IHttpClientBuilder
, que proporcionan controladores para agregar automáticamente tokens de acceso a las solicitudes salientes.
Esta biblioteca es compatible con todos los tiempos de ejecución de .NET Standard 2.0 (se recomienda .NET 8+) y es adecuada para su uso en aplicaciones ASP.NET Core y .NET Generic Host independientes.
Agregue Auth0Net.DependencyInjection
a su proyecto:
Install-Package Auth0Net.DependencyInjection
Si simplemente está utilizando AuthenticationApiClient
y nada más, puede llamar AddAuth0AuthenticationClientCore
y pasar su dominio Auth0. Esta integración es liviana y no admite ninguna otra característica de esta biblioteca.
services . AddAuth0AuthenticationClientCore ( "your-auth0-domain.auth0.com" ) ;
Luego puede solicitar IAuthenticationApiClient
dentro de su clase:
public class AuthController : ControllerBase
{
private readonly IAuthenticationApiClient _authenticationApiClient ;
public AuthController ( IAuthenticationApiClient authenticationApiClient )
{
_authenticationApiClient = authenticationApiClient ;
}
Agregue AuthenticationApiClient
con AddAuth0AuthenticationClient
y proporcione una configuración de aplicación de máquina a máquina que será consumida por las integraciones de Management Client, Token Cache e IHttpClientBuilder. Se debe llamar a esta extensión antes de usar cualquier otra extensión dentro de esta biblioteca:
services . AddAuth0AuthenticationClient ( config =>
{
config . Domain = builder . Configuration [ "Auth0:Domain" ] ;
config . ClientId = builder . Configuration [ "Auth0:ClientId" ] ;
config . ClientSecret = builder . Configuration [ "Auth0:ClientSecret" ] ;
} ) ;
Agregue ManagementApiClient
con AddAuth0ManagementClient()
y agregue DelegatingHandler
con AddManagementAccessToken()
que adjuntará el token de acceso automáticamente:
services . AddAuth0ManagementClient ( ) . AddManagementAccessToken ( ) ;
Asegúrese de que su aplicación Máquina a Máquina esté autorizada para solicitar tokens de la API de administración y que tenga los alcances correctos para las funciones que desea utilizar.
Luego puede solicitar IManagementApiClient
(o IAuthenticationApiClient
) dentro de sus servicios:
public class MyAuth0Service : IAuth0Service
{
private readonly IManagementApiClient _managementApiClient ;
public MyAuth0Service ( IManagementApiClient managementApiClient )
{
_managementApiClient = managementApiClient ;
}
Si está utilizando un dominio personalizado con su inquilino Auth0, puede encontrarse con un problema por el cual la audience
de la API de administración se configura incorrectamente. Puedes anular esto a través de la propiedad Audience
:
services . AddAuth0ManagementClient ( )
. AddManagementAccessToken ( c =>
{
c . Audience = "my-tenant.au.auth0.com" ;
} ) ;
Nota: Esta característica depende de que se llame y configure services.AddAuth0AuthenticationClient(config => ...)
como se describe en el escenario anterior.
Esta biblioteca incluye un controlador de delegación (efectivamente, middleware para su HttpClient) que agregará un token de acceso a todas las solicitudes salientes. Esto es útil para llamar a otros servicios protegidos por Auth0. Esta integración requiere que la implementación de su servicio utilice IHttpClientFactory
como parte de su registro. Puedes leer más sobre esto aquí.
Utilice AddAccessToken
junto con la audiencia requerida:
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( builder . Configuration [ "MyHttpService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyHttpService:Audience" ] ) ;
Esta extensión es compatible con cualquier registro que devuelva IHttpClientBuilder
, por lo que se puede utilizar con la fábrica de clientes de Grpc:
services . AddGrpcClient < UserService . UserServiceClient > ( x => x . Address = new Uri ( builder . Configuration [ "MyGrpcService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyGrpcService:Audience" ] ) ;
AddAccessToken
también tiene una opción para pasar una función que puede resolver la audiencia en tiempo de ejecución. Esto puede resultar útil si las audiencias esperadas siempre siguen un patrón o si confía en el descubrimiento de servicios, como el de Steeltoe.NET:
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( "https://MyServiceName/" ) )
. AddServiceDiscovery ( )
. AddAccessToken ( config => config . AudienceResolver = request => request . RequestUri . GetLeftPart ( UriPartial . Authority ) ) ;
Tanto los clientes de autenticación como los de autorización están registrados como singleton y son adecuados para su inyección en cualquier otra vida.
Tanto un ejemplo de .NET Generic Host como de ASP.NET Core están disponibles en el directorio de ejemplos.
Auth0TokenCache
almacenará en caché un token para una audiencia determinada hasta al menos el 95 % del tiempo de vencimiento. Si se realiza una solicitud a la caché entre el 95% y el 99% del vencimiento, el token se actualizará en segundo plano antes de que se alcance el vencimiento.
Se elimina un 1% adicional de la vida útil para proteger contra la desviación del reloj entre sistemas distribuidos.
En algunas situaciones, es posible que desees solicitar un token de acceso a Auth0 manualmente. Puede lograr esto inyectando IAuth0TokenCache
en una clase y llamando GetTokenAsync
con la audiencia de la API para la que solicita el token.
Se utiliza una instancia de FusionCache solo en memoria como implementación de almacenamiento en caché. Esta instancia tiene un nombre y no afectará otros usos de FusionCache.
Esta biblioteca expone una extensión de cadena simple, ToHttpsUrl()
, que se puede usar para formatear el dominio Auth0 desnudo que se encuentra en su configuración en una URL adecuada.
Esto es idéntico a https://{Configuration["Auth0:Domain"]}/
que normalmente terminas escribiendo en algún lugar de tu Startup.cs
.
Por ejemplo, formatear el dominio para JWT Authority:
. AddJwtBearer ( options =>
{
// "my-tenant.auth0.com" -> "https://my-tenant.auth0.com/"
options . Authority = builder . Configuration [ "Auth0:Domain" ] . ToHttpsUrl ( ) ;
//...
} ) ;
No estoy afiliado ni represento a Auth0. Todos los problemas de implementación relacionados con ManagementApiClient
y AuthenticationApiClient
subyacentes deben dirigirse al repositorio oficial Auth0.NET.
Iconos utilizados bajo la Licencia MIT del paquete Identicons.