การออกโทเค็น
สร้างโทเค็นที่ลงลายเซ็นเมื่อเข้าสู่ระบบ
การออกโทเค็น เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครงสร้างและข้ออ้างสิทธิ์ของ JWT
- การกำหนดค่าการยืนยันตัวตน JWT Bearer
- การออกโทเค็น
- โทเค็นรีเฟรชและวันหมดอายุ