0Pricing
C# Academy · درس

إصدار الرموز المميّزة

ولّدوا رموزًا موقّعة عند تسجيل الدخول

إصدار الرموز المميّزة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

الإصدار مقابل التحقق

تحققتم حتى الآن من صحة الرموز. والآن ستقومون بإصدارها: بعد تسجيل دخول المستخدم بنجاح، تنشئ واجهة API الخاصة بكم JWT موقّعًا وتعيده.

النوع الأساسي لذلك هو JwtSecurityTokenHandler من System.IdentityModel.Tokens.Jwt.

dotnet add package System.IdentityModel.Tokens.Jwt

مفتاح التوقيع

لتوقيع رمز، تحتاجون إلى مفتاح. في HS256، تعيدون استخدام السر المتماثل نفسه الذي يستخدمه المدقق.

احتفظوا بهذا السر خارج نظام التحكم في المصدر، وحمّلوه من الإعدادات أو من مخزن أسرار.

var key = new SymmetricSecurityKey(
    Encoding.UTF8.GetBytes(configuration["Jwt:Key"]!));

SigningCredentials

يربط SigningCredentials المفتاح بالخوارزمية. وبالنسبة إلى مفتاح متماثل، استخدموا SecurityAlgorithms.HmacSha256.

var creds = new SigningCredentials(
    key,
    SecurityAlgorithms.HmacSha256);

إنشاء المطالبات

حدّدوا ما الذي سيدخل في الرمز. أدرجوا دائمًا موضوعًا، وهو معرّف المستخدم، وأي أدوار أو بيانات تحتاج إليها واجهة API.

أضيفوا jti فريدًا لكي يمكن تحديد كل رمز.

var claims = new List<Claim>
{
    new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
    new Claim(ClaimTypes.Name, user.UserName),
    new Claim(ClaimTypes.Role, user.Role)
};

إنشاء JwtSecurityToken

يجمع JwtSecurityToken جهة الإصدار والجمهور والمطالبات ووقت الانتهاء وبيانات اعتماد التوقيع في كائن رمز واحد.

var token = new JwtSecurityToken(
    issuer: configuration["Jwt:Issuer"],
    audience: configuration["Jwt:Audience"],
    claims: claims,
    notBefore: DateTime.UtcNow,
    expires: DateTime.UtcNow.AddMinutes(15),
    signingCredentials: creds);

تسلسل الرمز إلى سلسلة نصية

يجب كتابة كائن الرمز بصيغته النصية المدمجة header.payload.signature قبل إرساله إلى العميل.

var handler = new JwtSecurityTokenHandler();
string jwt = handler.WriteToken(token);
// jwt now looks like eyJhbGciOiJI...

خدمة رموز قابلة لإعادة الاستخدام

غلّفوا المنطق في خدمة حتى تبقى وحدات التحكم نظيفة، وتكون الإعدادات موجودة في مكان واحد.

public class TokenService(IConfiguration config)
{
    public string CreateAccessToken(AppUser user)
    {
        var key = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes(config["Jwt:Key"]!));
        var creds = new SigningCredentials(
            key, SecurityAlgorithms.HmacSha256);
        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
            new Claim(ClaimTypes.Role, user.Role)
        };
        var token = new JwtSecurityToken(
            config["Jwt:Issuer"], config["Jwt:Audience"],
            claims, expires: DateTime.UtcNow.AddMinutes(15),
            signingCredentials: creds);
        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

ربط نقطة نهاية تسجيل الدخول

تتحقق نقطة نهاية تسجيل الدخول من بيانات الاعتماد، ثم تستدعي الخدمة وتعيد الرمز إلى العميل.

app.MapPost("/login", (LoginDto dto, TokenService tokens) =>
{
    var user = Authenticate(dto.Username, dto.Password);
    if (user is null) return Results.Unauthorized();
    return Results.Ok(new { accessToken = tokens.CreateAccessToken(user) });
});

المتماثل مقابل غير المتماثل

يستخدم HS256 سرًا مشتركًا واحدًا للتوقيع والتحقق معًا. أما RS256 فيستخدم مفتاحًا خاصًا للتوقيع ومفتاحًا عامًا للتحقق.

يتيح التوقيع غير المتماثل نشر المفتاح العام لكي تتحقق الخدمات الأخرى من صحة الرموز دون امتلاك سر التوقيع في أي وقت.

var creds = new SigningCredentials(
    new RsaSecurityKey(rsaPrivateKey),
    SecurityAlgorithms.RsaSha256);

تسجيل الخدمة

أضيفوا خدمة الرموز إلى حقن الاعتماديات حتى يمكن حقنها في نقاط النهاية ووحدات التحكم.

builder.Services.AddScoped<TokenService>();

اجعلوا الرموز مقتضبة وقصيرة العمر

أفضل ممارستين عند إصدار الرموز:

  • مقتضبة: أدرجوا المطالبات التي تحتاج إليها واجهة API فقط، فالرمز ينتقل مع كل طلب.
  • قصيرة العمر: تحدّ رموز الوصول التي تستمر من 5 إلى 15 دقيقة من الضرر في حال تسرّب أحدها.
expires: DateTime.UtcNow.AddMinutes(15)

اختبار سريع

تأكدوا مما تعلّمتموه حول إصدار الرموز.

مراجعة

أصدرتم JWTs موقّعة:

  • يربط SigningCredentials مفتاحكم بخوارزمية.
  • أنشئوا قائمة من Claims، ثم أنشئوا JwtSecurityToken مع جهة الإصدار والجمهور ووقت الانتهاء.
  • تُجري JwtSecurityTokenHandler.WriteToken تسلسل الرمز إلى السلسلة النصية المدمجة.
  • حافظوا على أن تكون الرموز مقتضبة وقصيرة العمر.

بعد ذلك: رموز التحديث واستراتيجيات انتهاء الصلاحية.

الأسئلة الشائعة

هل درس «إصدار الرموز المميّزة» مجاني؟

نعم — نص درس «إصدار الرموز المميّزة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «إصدار الرموز المميّزة»؟

ولّدوا رموزًا موقّعة عند تسجيل الدخول تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «إصدار الرموز المميّزة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. بنية JWT والمطالبات
  2. تهيئة مصادقة JWT Bearer
  3. إصدار الرموز المميّزة
  4. الرموز المميّزة للتحديث وانتهاء الصلاحية
← العودة إلى C# Academy