عميل OAuth لـ C# (.NET): مكتبة IdentityModel والتكامل مع OAuth 2.0

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مكتبة IdentityModel لـ OAuth 2.0 و OpenID Connect في C# (.NET)

\n\n

عند تطوير تطبيقات الويب الحديثة، أو العملاء المحمولين، أو واجهات برمجة التطبيقات (API) من جانب الخادم على منصة .NET، تنشأ دائمًا تقريبًا الحاجة إلى التكامل مع موفري المصادقة الخارجيين (Google، GitHub، Microsoft، وغيرها) أو خادم الترخيص الخاص بك. IdentityModel هي مكتبة خفيفة الوزن ولكنها قوية لـ C#، توفر عميل OAuth مناسبًا للعمل مع بروتوكولات OAuth 2.0 و OpenID Connect. وهي تعتبر المعيار الفعلي في نظام .NET البيئي لتنفيذ تدفقات الترخيص.

\n\n

في هذه المقالة، سنشرح بالتفصيل كيفية استخدام IdentityModel لإنشاء عميل OAuth، والحصول على رموز الوصول وتحديثها. ستكون أمثلة الكود بلغة C# (.NET 6+).

\n\n

التثبيت والتوصيل

\n\n

للبدء، قم بتثبيت الحزمة عبر NuGet Package Manager:

\n\n
dotnet add package IdentityModel
\n\n

أو عبر وحدة تحكم مدير الحزم:

\n\n
Install-Package IdentityModel
\n\n

بعد التثبيت، ستحصل على إمكانية الوصول إلى امتدادات HttpClient، و DiscoveryClient، و TokenClient، وأدوات مساعدة أخرى.

\n\n

السيناريو الأساسي: الحصول على رمز مميز عبر Client Credentials

\n\n

يُستخدم هذا التدفق للمصادقة بين الخادم والخادم، عندما يطلب العميل (تطبيقك) رمزًا مميزًا نيابة عن نفسه، وليس عن المستخدم.

\n\n

مثال على إعداد عميل OAuth:

\n\n
using IdentityModel.Client;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\npublic async Task<string> GetAccessTokenAsync()\n{\n    var client = new HttpClient();\n\n    // 1. الحصول على مستند الاكتشاف من خادم الترخيص\n    var disco = await client.GetDiscoveryDocumentAsync("https://your-auth-server.com");\n    if (disco.IsError)\n    {\n        throw new Exception($"خطأ في الحصول على الاكتشاف: {disco.Error}");\n    }\n\n    // 2. طلب الرمز المميز باستخدام client_id و client_secret\n    var tokenResponse = await client.RequestClientCredentialsTokenAsync(\n        new ClientCredentialsTokenRequest\n        {\n            Address = disco.TokenEndpoint,\n            ClientId = "your-client-id",\n            ClientSecret = "your-client-secret",\n            Scope = "api1 api2" // الأذونات المطلوبة\n        });\n\n    if (tokenResponse.IsError)\n    {\n        throw new Exception($"خطأ في الحصول على الرمز المميز: {tokenResponse.Error}");\n    }\n\n    return tokenResponse.AccessToken;\n}
\n\n

في هذا المثال، نستخدم طرق الامتداد من مساحة الأسماء IdentityModel.Client. تقوم المكتبة تلقائيًا بمعالجة تسلسل JSON والرؤوس وتحليل الردود.

\n\n

تدفق رمز الترخيص (بمشاركة المستخدم)

\n\n

للتطبيقات ذات واجهة المستخدم (ASP.NET Core MVC، Blazor، سطح المكتب)، يُستخدم رمز الترخيص في الغالب. تتكامل IdentityModel مع Microsoft.AspNetCore.Authentication.OpenIdConnect، ولكنها توفر أيضًا أدوات منخفضة المستوى للتنفيذ اليدوي.

\n\n

مثال على الحصول على رمز مميز بعد إعادة التوجيه باستخدام الكود:

\n\n
public async Task<TokenResponse> ExchangeCodeForTokenAsync(string authorizationCode, string redirectUri)\n{\n    var client = new HttpClient();\n    var disco = await client.GetDiscoveryDocumentAsync("https://your-auth-server.com");\n\n    var tokenResponse = await client.RequestAuthorizationCodeTokenAsync(\n        new AuthorizationCodeTokenRequest\n        {\n            Address = disco.TokenEndpoint,\n            ClientId = "your-client-id",\n            ClientSecret = "your-client-secret",\n            Code = authorizationCode,\n            RedirectUri = redirectUri\n        });\n\n    return tokenResponse;\n}
\n\n

تحديث الرمز المميز (Refresh Token)

\n\n

عادةً ما تكون صلاحية رموز الوصول (Access tokens) قصيرة (على سبيل المثال، ساعة واحدة).

توصيات