رموز JWT في C# (.NET): العمل مع System.IdentityModel.Tokens.Jwt

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

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

ابدأ الدورة

رموز JWT في C# (.NET): دليل كامل للعمل مع System.IdentityModel.Tokens.Jwt

\n\n

JSON Web Token (JWT) هو تنسيق مضغوط وآمن لعناوين URL لنقل البيانات بين الأطراف على شكل كائن JSON. في بيئة C# (.NET)، يتم استخدام المكتبة القوية System.IdentityModel.Tokens.Jwt للعمل مع JWT، وهي جزء من حزمة Microsoft.IdentityModel.Tokens. تتيح هذه الأداة توليد وتوقيع والتحقق وفك تشفير رموز JWT، مما يوفر توثيقًا آمنًا وتبادل البيانات في تطبيقات الويب وواجهات برمجة التطبيقات (API) والخدمات المصغرة.

\n\n

تثبيت المكتبة

\n

للبدء، أضف حزمة NuGet إلى المشروع. نفذ الأمر في وحدة تحكم مدير الحزم:

\n
dotnet add package System.IdentityModel.Tokens.Jwt
\n

أو عبر Package Manager Console في Visual Studio:

\n
Install-Package System.IdentityModel.Tokens.Jwt
\n\n

المكونات الرئيسية للمكتبة

\n
    \n
  • JwtSecurityTokenHandler — الفئة الرئيسية لإنشاء وتسلسل والتحقق من الرموز.
  • \n
  • SecurityTokenDescriptor — وصف الرمز: المطالبات (claims)، وقت الصلاحية، التوقيع.
  • \n
  • SymmetricSecurityKey — مفتاح متماثل للتوقيع (HS256, HS384, HS512).
  • \n
  • SigningCredentials — بيانات اعتماد التوقيع (الخوارزمية + المفتاح).
  • \n
  • TokenValidationParameters — معلمات التحقق من الصحة (التحقق من التوقيع، وقت الصلاحية، المُصدر).
  • \n
\n\n

توليد رمز JWT في C#

\n

لنقم بإنشاء رمز بسيط مع مطالبات (claims) مخصصة ووقت صلاحية ساعة واحدة:

\n
using System.IdentityModel.Tokens.Jwt;\nusing System.Security.Claims;\nusing System.Text;\nusing Microsoft.IdentityModel.Tokens;\n\npublic string GenerateToken()\n{\n    var secretKey = "my_super_secret_key_1234567890!";\n    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));\n    var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);\n\n    var claims = new[]\n    {\n        new Claim(ClaimTypes.Name, "إيفان بيتروف"),\n        new Claim(ClaimTypes.Email, "ivan@example.com"),\n        new Claim(ClaimTypes.Role, "Admin")\n    };\n\n    var tokenDescriptor = new SecurityTokenDescriptor\n    {\n        Subject = new ClaimsIdentity(claims),\n        Expires = DateTime.UtcNow.AddHours(1),\n        Issuer = "MyApp",\n        Audience = "MyAppUsers",\n        SigningCredentials = credentials\n    };\n\n    var tokenHandler = new JwtSecurityTokenHandler();\n    var token = tokenHandler.CreateToken(tokenDescriptor);\n    return tokenHandler.WriteToken(token);\n}
\n\n

التحقق من صحة رمز JWT

\n

عند استلام الرمز من العميل، يجب التحقق من توقيعه، تاريخ صلاحيته ومعلمات أخرى:

\n
public ClaimsPrincipal ValidateToken(string token)\n{\n    var secretKey = "my_super_secret_key_1234567890!";\n    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));\n\n    var tokenHandler = new JwtSecurityTokenHandler();\n    var validationParameters = new TokenValidationParameters\n    {\n        ValidateIssuer = true,\n        ValidIssuer = "MyApp",\n        ValidateAudience = true,\n        ValidAudience = "MyAppUsers",\n        ValidateLifetime = true,\n        IssuerSigningKey = key,\n        ClockSkew = TimeSpan.Zero // إزالة هامش الوقت الافتراضي\n    };\n\n    try\n    {\n        var principal = tokenHandler.ValidateToken(token, validationParameters, out SecurityToken validatedToken);\n        return principal;\n    }\n    catch (SecurityTokenExpiredException)\n    {\n        Console.WriteLine("الرمز منتهي الصلاحية");\n        return null;\n    }\n    catch (SecurityTokenInvalidSignatureException)\n    {\n        Console.WriteLine("توقيع الرمز غير صحيح");\n        return null;\n    }\n}
\n\n

فك تشفير الرمز دون التحقق من التوقيع

\n

في بعض الأحيان، تحتاج فقط إلى قراءة

توصيات