将 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 许可证使用的图标。