قد يكون دمج Auth0.NET في مشروعك مع اتباع اصطلاحات .NET الاصطلاحية أمرًا مرهقًا ويتضمن قدرًا كبيرًا من القواعد المشتركة بين المشاريع.
وتأمل هذه المكتبة في حل هذه المشكلة، حيث تضم:
ملحقات لـ Microsoft.Extensions.DependencyInjection
.
التخزين المؤقت والتجديد لرمز الوصول التلقائي لواجهة برمجة تطبيقات الإدارة وخدمات 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 ( ) ;
تأكد من أن تطبيق "من آلة إلى آلة" الخاص بك مخول بطلب الرموز المميزة من Managment 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 Generic Host وASP.NET Core في دليل العينات.
سيقوم Auth0TokenCache
بتخزين رمز مميز لجمهور معين حتى 95٪ على الأقل من وقت انتهاء الصلاحية. إذا تم طلب ذاكرة التخزين المؤقت بين 95% و99% من انتهاء الصلاحية، فسيتم تحديث الرمز المميز في الخلفية قبل الوصول إلى انتهاء الصلاحية.
تتم إزالة 1% إضافية من العمر للحماية من انحراف الساعة بين الأنظمة الموزعة.
في بعض المواقف قد ترغب في طلب رمز وصول من Auth0 يدويًا. يمكنك تحقيق ذلك عن طريق إدخال IAuth0TokenCache
في الفصل الدراسي واستدعاء GetTokenAsync
مع جمهور واجهة برمجة التطبيقات (API) التي تطلب الرمز المميز لها.
يتم استخدام مثيل FusionCache في الذاكرة فقط كتطبيق للتخزين المؤقت. تم تسمية هذا المثيل ولن يؤثر على الاستخدامات الأخرى لـ FusionCache.
تعرض هذه المكتبة امتداد سلسلة بسيط، ToHttpsUrl()
، والذي يمكن استخدامه لتنسيق نطاق Auth0 المجرد الموجود في التكوين الخاص بك إلى عنوان URL مناسب.
وهذا مطابق لـ https://{Configuration["Auth0:Domain"]}/
الذي ينتهي بك الأمر عادةً إلى كتابته في مكان ما في Startup.cs
الخاص بك.
على سبيل المثال، تنسيق المجال لهيئة JWT:
. 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.