將 Auth0.NET 整合到您的專案中,同時遵循慣用的 .NET 約定可能會很麻煩,並且涉及專案之間共用的大量樣板檔案。
該庫希望解決這個問題,其特點是:
Microsoft.Extensions.DependencyInjection
的擴充。
管理 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 ;
}
使用AddAuth0AuthenticationClient
新增AuthenticationApiClient
,並提供將由管理用戶端、令牌快取和 IHttpClientBuilder 整合使用的機器對機器應用程式配置。在使用此庫中的任何其他擴充功能之前必須呼叫此擴充功能:
services . AddAuth0AuthenticationClient ( config =>
{
config . Domain = builder . Configuration [ "Auth0:Domain" ] ;
config . ClientId = builder . Configuration [ "Auth0:ClientId" ] ;
config . ClientSecret = builder . Configuration [ "Auth0:ClientSecret" ] ;
} ) ;
使用AddAuth0ManagementClient()
新增ManagementApiClient
並使用AddManagementAccessToken()
新增DelegatingHandler
,這將自動附加存取權杖:
services . AddAuth0ManagementClient ( ) . AddManagementAccessToken ( ) ;
確保您的機器對機器應用程式有權從管理 API 請求令牌,並且它具有您希望使用的功能的正確範圍。
然後,您可以在服務中請求IManagementApiClient
(或IAuthenticationApiClient
):
public class MyAuth0Service : IAuth0Service
{
private readonly IManagementApiClient _managementApiClient ;
public MyAuth0Service ( IManagementApiClient managementApiClient )
{
_managementApiClient = managementApiClient ;
}
如果您在 Auth0 租用戶中使用自訂網域,則可能會遇到管理 API audience
設定不正確的問題。您可以透過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
注入到類別中並透過您要求令牌的 API 的受眾呼叫GetTokenAsync
來實現此目的。
FusionCache 的僅記憶體實例用作快取實作。該實例已命名,不會影響FusionCache的其他使用。
該程式庫公開了一個簡單的字串擴充ToHttpsUrl()
,可用於將配置中的裸 Auth0 域格式化為正確的 URL。
這與您通常最終在Startup.cs
中的某個位置編寫的https://{Configuration["Auth0:Domain"]}/
相同。
例如,格式化 JWT Authority 的域:
. AddJwtBearer ( options =>
{
// "my-tenant.auth0.com" -> "https://my-tenant.auth0.com/"
options . Authority = builder . Configuration [ "Auth0:Domain" ] . ToHttpsUrl ( ) ;
//...
} ) ;
我不隸屬於 Auth0,也不代表 Auth0。有關底層ManagementApiClient
和AuthenticationApiClient
的所有實作問題都應轉到官方 Auth0.NET 儲存庫。
根據 Identicons 套件的 MIT 許可證使用的圖示。