0Pricing
C# Academy · บทเรียน

การออกโทเค็น

สร้างโทเค็นที่ลงลายเซ็นเมื่อเข้าสู่ระบบ

การออกโทเค็น เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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)

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

ยืนยันความเข้าใจเกี่ยวกับการออกโทเค็น

ทบทวน

คุณได้ออก JWT ที่มีลายเซ็นแล้ว:

  • SigningCredentials จับคู่คีย์ของคุณเข้ากับอัลกอริทึม
  • สร้างรายการ Claim จากนั้นสร้าง JwtSecurityToken ที่มีผู้ออก กลุ่มผู้รับ และวันหมดอายุ
  • JwtSecurityTokenHandler.WriteToken แปลงโทเค็นเป็นสตริงกระชับ
  • ทำให้โทเค็นกระชับและมีอายุสั้น

ต่อไป: โทเค็นรีเฟรชและกลยุทธ์การหมดอายุ

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

บทเรียน “การออกโทเค็น” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การออกโทเค็น”

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

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

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

บทเรียน “การออกโทเค็น” ใช้เวลานานแค่ไหน

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

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

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

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

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