رموز JWT في C# (.NET): دليل كامل للعمل مع System.IdentityModel.Tokens.Jwt
\n\nJSON Web Token (JWT) هو تنسيق مضغوط وآمن لعناوين URL لنقل البيانات بين الأطراف على شكل كائن JSON. في بيئة C# (.NET)، يتم استخدام المكتبة القوية System.IdentityModel.Tokens.Jwt للعمل مع JWT، وهي جزء من حزمة Microsoft.IdentityModel.Tokens. تتيح هذه الأداة توليد وتوقيع والتحقق وفك تشفير رموز JWT، مما يوفر توثيقًا آمنًا وتبادل البيانات في تطبيقات الويب وواجهات برمجة التطبيقات (API) والخدمات المصغرة.
\n\nتثبيت المكتبة
\nللبدء، أضف حزمة NuGet إلى المشروع. نفذ الأمر في وحدة تحكم مدير الحزم:
\ndotnet add package System.IdentityModel.Tokens.Jwt\nأو عبر Package Manager Console في Visual Studio:
\nInstall-Package System.IdentityModel.Tokens.Jwt\n\nالمكونات الرئيسية للمكتبة
\n- \n
JwtSecurityTokenHandler— الفئة الرئيسية لإنشاء وتسلسل والتحقق من الرموز. \n SecurityTokenDescriptor— وصف الرمز: المطالبات (claims)، وقت الصلاحية، التوقيع. \n SymmetricSecurityKey— مفتاح متماثل للتوقيع (HS256, HS384, HS512). \n SigningCredentials— بيانات اعتماد التوقيع (الخوارزمية + المفتاح). \n TokenValidationParameters— معلمات التحقق من الصحة (التحقق من التوقيع، وقت الصلاحية، المُصدر). \n
توليد رمز JWT في C#
\nلنقم بإنشاء رمز بسيط مع مطالبات (claims) مخصصة ووقت صلاحية ساعة واحدة:
\nusing 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عند استلام الرمز من العميل، يجب التحقق من توقيعه، تاريخ صلاحيته ومعلمات أخرى:
\npublic 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في بعض الأحيان، تحتاج فقط إلى قراءة