Интеграция Auth0.NET в ваш проект при соблюдении идиоматических соглашений .NET может быть обременительной и включать в себя значительный объем шаблонного кода, совместно используемого между проектами.
Эта библиотека надеется решить эту проблему, предлагая:
Расширения для Microsoft.Extensions.DependencyInjection
.
Автоматическое кэширование и обновление токенов доступа для Management API и ваших собственных служб REST и Grpc.
Интеграция HttpClientFactory для централизованного расширения и управления внутренними обработчиками HTTP.
Расширения IHttpClientBuilder
, предоставляющие обработчики для автоматического добавления токенов доступа к исходящим запросам.
Эта библиотека совместима со всеми средами выполнения .NET Standard 2.0 (рекомендуется .NET 8+) и подходит для использования в ASP.NET Core и автономных приложениях .NET Generic Host.
Добавьте Auth0Net.DependencyInjection
в свой проект:
Install-Package Auth0Net.DependencyInjection
Если вы просто используете AuthenticationApiClient
и ничего больше, вы можете вызвать AddAuth0AuthenticationClientCore
и передать свой домен Auth0. Эта интеграция является легкой и не поддерживает никаких других функций этой библиотеки.
services . AddAuth0AuthenticationClientCore ( "your-auth0-domain.auth0.com" ) ;
Затем вы можете запросить IAuthenticationApiClient
в своем классе:
public class AuthController : ControllerBase
{
private readonly IAuthenticationApiClient _authenticationApiClient ;
public AuthController ( IAuthenticationApiClient authenticationApiClient )
{
_authenticationApiClient = authenticationApiClient ;
}
Добавьте AuthenticationApiClient
с помощью AddAuth0AuthenticationClient
и предоставьте конфигурацию приложения между компьютерами, которая будет использоваться интеграциями Management Client, Token Cache и IHttpClientBuilder. Это расширение необходимо вызвать перед использованием любых других расширений в этой библиотеке:
services . AddAuth0AuthenticationClient ( config =>
{
config . Domain = builder . Configuration [ "Auth0:Domain" ] ;
config . ClientId = builder . Configuration [ "Auth0:ClientId" ] ;
config . ClientSecret = builder . Configuration [ "Auth0:ClientSecret" ] ;
} ) ;
Добавьте ManagementApiClient
с помощью AddAuth0ManagementClient()
и добавьте DelegatingHandler
с AddManagementAccessToken()
который автоматически прикрепит токен доступа:
services . AddAuth0ManagementClient ( ) . AddManagementAccessToken ( ) ;
Убедитесь, что ваше межмашинное приложение имеет право запрашивать токены из API управления и имеет правильные области для функций, которые вы хотите использовать.
Затем вы можете запросить IManagementApiClient
(или IAuthenticationApiClient
) в своих службах:
public class MyAuth0Service : IAuth0Service
{
private readonly IManagementApiClient _managementApiClient ;
public MyAuth0Service ( IManagementApiClient managementApiClient )
{
_managementApiClient = managementApiClient ;
}
Если вы используете собственный домен с клиентом Auth0, вы можете столкнуться с проблемой, связанной с неправильной настройкой audience
Management API. Вы можете переопределить это с помощью свойства Audience
:
services . AddAuth0ManagementClient ( )
. AddManagementAccessToken ( c =>
{
c . Audience = "my-tenant.au.auth0.com" ;
} ) ;
Примечание. Эта функция зависит от вызова и настройки services.AddAuth0AuthenticationClient(config => ...)
как описано в предыдущем сценарии.
Эта библиотека включает в себя обработчик делегирования (по сути, промежуточное программное обеспечение для вашего HttpClient), который будет добавлять токен доступа ко всем исходящим запросам. Это полезно для вызова других служб, защищенных Auth0. Эта интеграция требует, чтобы ваша реализация службы использовала IHttpClientFactory
в рамках своей регистрации. Вы можете прочитать больше об этом здесь
Используйте AddAccessToken
вместе с необходимой аудиторией:
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( builder . Configuration [ "MyHttpService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyHttpService:Audience" ] ) ;
Это расширение совместимо с любой регистрацией, которая возвращает IHttpClientBuilder
, поэтому его можно использовать с клиентской фабрикой Grpc:
services . AddGrpcClient < UserService . UserServiceClient > ( x => x . Address = new Uri ( builder . Configuration [ "MyGrpcService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyGrpcService:Audience" ] ) ;
AddAccessToken
также имеет возможность передать функцию, которая может определять аудиторию во время выполнения. Это может быть полезно, если ожидаемая аудитория всегда следует определенному шаблону или если вы полагаетесь на обнаружение сервисов, например, от Steeltoe.NET:
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( "https://MyServiceName/" ) )
. AddServiceDiscovery ( )
. AddAccessToken ( config => config . AudienceResolver = request => request . RequestUri . GetLeftPart ( UriPartial . Authority ) ) ;
Клиенты аутентификации и авторизации регистрируются как одиночные и подходят для внедрения в любое другое время жизни.
В каталоге примеров доступны как универсальный хост .NET, так и пример ASP.NET Core.
Auth0TokenCache
будет кэшировать токен для заданной аудитории как минимум до 95 % срока действия. Если запрос к кешу выполняется между 95% и 99% срока действия, токен будет обновлен в фоновом режиме до истечения срока действия.
Дополнительный 1% срока службы удален для защиты от дрейфа тактовой частоты между распределенными системами.
В некоторых ситуациях вам может потребоваться запросить токен доступа у Auth0 вручную. Этого можно добиться, внедрив IAuth0TokenCache
в класс и вызвав GetTokenAsync
с аудиторией API, для которого вы запрашиваете токен.
В качестве реализации кэширования используется экземпляр FusionCache, находящийся только в памяти. Этот экземпляр имеет имя и не повлияет на другое использование FusionCache.
Эта библиотека предоставляет простое строковое расширение ToHttpsUrl()
, которое можно использовать для форматирования чистого домена Auth0, находящегося в вашей конфигурации, в правильный URL-адрес.
Это идентично https://{Configuration["Auth0:Domain"]}/
который вы обычно пишете где-то в Startup.cs
.
Например, форматирование домена для JWT Authority:
. AddJwtBearer ( options =>
{
// "my-tenant.auth0.com" -> "https://my-tenant.auth0.com/"
options . Authority = builder . Configuration [ "Auth0:Domain" ] . ToHttpsUrl ( ) ;
//...
} ) ;
Я не связан и не представляю Auth0. Все проблемы реализации, касающиеся базовых ManagementApiClient
и AuthenticationApiClient
следует отправлять в официальный репозиторий Auth0.NET.
Значки, используемые по лицензии MIT из пакета Identicons.