C# Academy · บทเรียน

โครงสร้างและข้ออ้างสิทธิ์ของ JWT

ทำความเข้าใจส่วนหัว เพย์โหลด และลายเซ็น

บทเรียน 1 จาก 413 ขั้นตอน

โครงสร้างและข้ออ้างสิทธิ์ของ JWT เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

JWT คืออะไร

JSON Web Token (JWT) คือรูปแบบโทเค็นขนาดกะทัดรัดที่ปลอดภัยสำหรับ URL ใช้ส่งข้อมูลอ้างสิทธิ์ระหว่างสองฝ่ายอย่างปลอดภัย ใน ASP.NET Core รูปแบบนี้เป็นวิธีที่ใช้กันมากที่สุดในการยืนยันตัวตนของ API แบบไร้สถานะ

JWT เป็นเพียงสตริงที่ประกอบด้วยสามส่วนซึ่งเข้ารหัสแบบ Base64Url และเชื่อมด้วยจุด: header.payload.signature

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0Iiwicm9sZSI6ImFkbWluIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

ส่วนหัว

ส่วนหัวอธิบายวิธีลงลายเซ็นให้โทเค็น ส่วนหัวเป็นออบเจ็กต์ JSON ขนาดเล็กที่ถูกเข้ารหัสแบบ Base64Url เป็นส่วนแรก

alg ระบุอัลกอริทึมสำหรับลงลายเซ็น (เช่น HS256, RS256) และ typ มักเป็น JWT เสมอ

{
  "alg": "HS256",
  "typ": "JWT"
}

ข้อมูลบรรทุก

ข้อมูลบรรทุกประกอบด้วยข้อมูลอ้างสิทธิ์ ซึ่งเป็นข้อความเกี่ยวกับผู้ใช้และข้อมูลเมทาดาทาของโทเค็น โดยอยู่ในส่วนที่สอง

สำคัญ: ข้อมูลบรรทุกถูกเพียงเข้ารหัสรูปแบบเท่านั้น ไม่ได้เข้ารหัสเพื่อปกปิดข้อมูล ทุกคนสามารถถอดรหัสได้ ดังนั้นอย่าเก็บข้อมูลลับไว้ที่นี่

{
  "sub": "1234",
  "name": "Alice",
  "role": "admin",
  "exp": 1735689600
}

ลายเซ็น

ลายเซ็นรับรองว่าโทเค็นไม่ได้ถูกแก้ไข เซิร์ฟเวอร์จะคำนวณลายเซ็นจากส่วนหัวที่เข้ารหัส ข้อมูลบรรทุกที่เข้ารหัส และกุญแจลับ

หากมีใครเปลี่ยนอักขระในข้อมูลบรรทุกแม้แต่ตัวเดียว ลายเซ็นจะไม่ตรงกันอีกต่อไปและการตรวจสอบจะล้มเหลว

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secretKey
)

ข้อมูลอ้างสิทธิ์มาตรฐาน

ชื่อข้อมูลอ้างสิทธิ์บางชื่อถูกกำหนดให้เป็นมาตรฐานโดยข้อกำหนด JWT (RFC 7519) ชื่อเหล่านี้ใช้คีย์สั้น ๆ สามตัวอักษร:

  • iss - ผู้ออก
  • sub - หัวข้อ (รหัสผู้ใช้)
  • aud - กลุ่มผู้รับ
  • exp - เวลาหมดอายุ (วินาทีแบบ Unix)
  • nbf - ยังไม่ถูกต้องก่อนเวลานี้
  • iat - เวลาที่ออกให้
{
  "iss": "https://api.myapp.com",
  "aud": "myapp-clients",
  "sub": "42",
  "exp": 1735689600,
  "iat": 1735686000
}

ข้อมูลอ้างสิทธิ์แบบกำหนดเอง

นอกเหนือจากชุดมาตรฐานแล้ว คุณสามารถเพิ่มข้อมูลอ้างสิทธิ์แบบกำหนดเองตามที่แอปพลิเคชันต้องการได้ เช่น บทบาท สิทธิ์ รหัสผู้เช่า อีเมล และอื่น ๆ

ควรรักษาขนาดข้อมูลบรรทุกให้เล็ก เนื่องจากข้อมูลอ้างสิทธิ์ทุกรายการจะถูกส่งไปกับทุกคำขอ

{
  "sub": "42",
  "email": "alice@myapp.com",
  "role": "admin",
  "tenant_id": "acme",
  "permissions": ["orders:read", "orders:write"]
}

ข้อมูลอ้างสิทธิ์ใน ASP.NET Core

ใน .NET ข้อมูลอ้างสิทธิ์จะแสดงด้วยชนิด System.Security.Claims.Claim ข้อมูลอ้างสิทธิ์แต่ละรายการเป็นคู่ ประเภท / ค่า

เมื่อ JWT ผ่านการตรวจสอบความถูกต้อง ASP.NET Core จะแปลงแต่ละรายการในส่วนข้อมูลเป็น Claim ใน ClaimsPrincipal ของผู้ใช้

var claims = new List<Claim>
{
    new Claim(ClaimTypes.NameIdentifier, "42"),
    new Claim(ClaimTypes.Name, "Alice"),
    new Claim(ClaimTypes.Role, "admin"),
    new Claim("tenant_id", "acme")
};

ClaimsPrincipal และ ClaimsIdentity

ผู้ใช้ที่ผ่านการยืนยันตัวตนจะแสดงด้วย ClaimsPrincipal ซึ่งครอบคลุมออบเจ็กต์ ClaimsIdentity อย่างน้อยหนึ่งรายการ โดยแต่ละรายการเก็บชุดข้อมูลอ้างสิทธิ์ไว้

ในตัวควบคุม คุณเข้าถึงข้อมูลนี้ผ่าน User

// Inside a controller action
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
bool isAdmin = User.IsInRole("admin");
string? tenant = User.FindFirst("tenant_id")?.Value;

การจับคู่ประเภทข้อมูลอ้างสิทธิ์

โดยค่าเริ่มต้น ตัวจัดการ JWT จะจับคู่คีย์ JWT แบบสั้นกับประเภทข้อมูลอ้างสิทธิ์รูปแบบ URI แบบยาว เช่น sub จะกลายเป็น ClaimTypes.NameIdentifier

หากต้องการคงชื่อแบบสั้นเดิมไว้ ให้ปิดใช้งานการจับคู่ข้อมูลขาเข้าเพียงครั้งเดียวเมื่อเริ่มต้นระบบ

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
// Now User.FindFirst("sub") returns the raw 'sub' claim

ทำไมไม่ใช้คุกกี้เซสชันไปเลย

JWT มีข้อมูลครบในตัวเอง: เซิร์ฟเวอร์สามารถตรวจสอบความถูกต้องได้โดยใช้เพียงคีย์สำหรับลงนาม โดยไม่ต้องค้นหาฐานข้อมูลหรือใช้ที่เก็บเซสชันฝั่งเซิร์ฟเวอร์

คุณสมบัตินี้ทำให้ JWT เหมาะอย่างยิ่งสำหรับ API ที่ปรับขนาดในแนวนอนและไมโครเซอร์วิส ซึ่งโหนดใดก็สามารถตรวจสอบโทเค็นเดียวกันได้

// Client sends the token on every request:
// Authorization: Bearer eyJhbGciOiJIUzI1Ni...

ข้อแลกเปลี่ยน: การเพิกถอน

เนื่องจาก JWT มีข้อมูลครบในตัวเองและเชื่อถือได้จนกว่าจะหมดอายุ คุณจึงไม่สามารถ เพิกถอน JWT ได้โดยง่ายก่อนถึงเวลาที่ระบุใน exp

วิธีรับมือที่ใช้กันทั่วไปคือกำหนดให้โทเค็นเข้าถึงมีอายุสั้น และใช้คู่กับโทเค็นรีเฟรช ซึ่งจะกล่าวถึงภายหลังในหลักสูตรนี้

// Short-lived access token
exp = iat + 15 * 60;  // 15 minutes

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับโครงสร้างของ JWT

ทบทวน

คุณได้เรียนรู้โครงสร้างของ JWT และการทำงานของข้อมูลอ้างสิทธิ์ใน ASP.NET Core:

  • JWT ประกอบด้วย header.payload.signature โดยแต่ละส่วนเข้ารหัสแบบ Base64Url
  • ส่วนข้อมูลมีข้อมูลอ้างสิทธิ์ที่ลงทะเบียนไว้และกำหนดเอง ซึ่งเข้ารหัสไว้แต่ไม่ได้เข้ารหัสลับ
  • ลายเซ็นรับรองความถูกต้องครบถ้วนของข้อมูลโดยใช้ข้อมูลลับหรือคู่คีย์
  • .NET แปลงข้อมูลอ้างสิทธิ์เป็น ClaimsPrincipal ซึ่งคุณอ่านได้ผ่าน User

ต่อไปคุณจะกำหนดค่า ASP.NET Core เพื่อตรวจสอบความถูกต้องของโทเค็นเหล่านี้

เริ่มต้นได้ฟรี

เรียนรู้ C# ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
93
บทเรียน
346

คำถามที่พบบ่อย

บทเรียน “โครงสร้างและข้ออ้างสิทธิ์ของ JWT” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “โครงสร้างและข้ออ้างสิทธิ์ของ JWT” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “โครงสร้างและข้ออ้างสิทธิ์ของ JWT”

ทำความเข้าใจส่วนหัว เพย์โหลด และลายเซ็น คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “โครงสร้างและข้ออ้างสิทธิ์ของ JWT” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โครงสร้างและข้ออ้างสิทธิ์ของ JWT
  2. การกำหนดค่าการยืนยันตัวตน JWT Bearer
  3. การออกโทเค็น
  4. โทเค็นรีเฟรชและวันหมดอายุ
← กลับไปที่ C# Academy