ยอดมากครับ 😎 คำถามนี้คือระดับมืออาชีพเลย —
เรามาเรียน Microsoft.AspNetCore.Authentication.JwtBearer
แบบเข้าใจลึก + มีตัวอย่างครบทั้ง การตั้งค่า + Controller + Token Generator
🔥 1️⃣ Microsoft.AspNetCore.Authentication.JwtBearer
คืออะไร
เป็น middleware ใน ASP.NET Core
ใช้สำหรับ “ตรวจสอบความถูกต้องของ JWT (JSON Web Token)” ที่แนบมากับ Header ของ Request
JWT มักใช้ในระบบ Login / Authentication แบบ Token-based เช่น:
-
Web API / Mobile API
-
React / Angular Frontend ที่ไม่ใช้ Session
-
ระบบ Single Sign-On (SSO)
🧩 2️⃣ โครงสร้างของ JWT (JSON Web Token)
JWT คือข้อความที่เข้ารหัสแบบ Base64Url แบ่งเป็น 3 ส่วน:
HEADER.PAYLOAD.SIGNATURE
ตัวอย่าง:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjMiLCJuYW1lIjoiSmVuIE1haSJ9._GvbEJYVk1J... (ยาว)
-
Header → ระบุ algorithm (เช่น HS256)
-
Payload → ข้อมูลผู้ใช้ เช่น
id
,role
,exp
-
Signature → ลายเซ็นป้องกันการปลอมแปลง
⚙️ 3️⃣ การติดตั้ง NuGet
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
🧱 4️⃣ ตัวอย่างโปรเจกต์ ASP.NET Core API (net8.0)
Program.cs
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
// Secret key
var key = "super_secret_key_12345";
// ✅ เพิ่ม Authentication แบบ JWT
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "yourapp.com",
ValidAudience = "yourapp.com",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key))
};
});
builder.Services.AddControllers();
var app = builder.Build();
app.UseAuthentication(); // ✅ ต้องอยู่ก่อน Authorization
app.UseAuthorization();
app.MapControllers();
app.Run();
🪪 5️⃣ Controller สร้าง Token (Login)
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel model)
{
// ตัวอย่างตรวจสอบ username/password
if (model.Username != "admin" || model.Password != "1234")
return Unauthorized();
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("super_secret_key_12345"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, model.Username),
new Claim(ClaimTypes.Role, "Administrator"),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken(
issuer: "yourapp.com",
audience: "yourapp.com",
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds
);
return Ok(new
{
token = new JwtSecurityTokenHandler().WriteToken(token)
});
}
}
public class LoginModel
{
public string Username { get; set; }
public string Password { get; set; }
}
🔹 เมื่อเรียก POST /api/auth/login
จะได้ JWT Token กลับมา เช่น
{
"token": "eyJhbGciOiJIUzI1NiIs..."
}
🛡️ 6️⃣ Controller ที่ต้องการ Auth
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Route("api/[controller]")]
[ApiController]
public class SecureController : ControllerBase
{
[HttpGet]
[Authorize] // ✅ ต้องแนบ JWT ถึงเข้าได้
public IActionResult GetSecureData()
{
var username = User.Identity?.Name ?? "Unknown";
return Ok($"สวัสดี {username}, คุณเข้าถึงข้อมูลลับได้แล้ว!");
}
[HttpGet("admin")]
[Authorize(Roles = "Administrator")] // ✅ ตรวจ Role
public IActionResult GetAdminData()
{
return Ok("ข้อมูลสำหรับ Admin เท่านั้น!");
}
}
🧠 7️⃣ การทดสอบด้วย Postman / Frontend
-
เรียก
POST /api/auth/login
→ จะได้ JWT -
ใช้ JWT ใน Header ของ Request อื่น:
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
🔍 8️⃣ สรุปภาพรวมการทำงาน
Client → POST /login → ได้ JWT Token
Client → แนบ Token ใน Header → GET /secure
Server → ตรวจสอบ Token ด้วย JwtBearerMiddleware
→ ถ้า valid → Controller ทำงาน
→ ถ้า invalid → 401 Unauthorized
🧩 9️⃣ ปัญหาที่พบบ่อย
อาการ | สาเหตุ | วิธีแก้ |
---|---|---|
401 Unauthorized | Token ผิด / หมดอายุ | ตรวจสอบ exp หรือ secret key |
Signature validation failed | Key ฝั่งสร้าง-ฝั่งตรวจไม่ตรงกัน | ใช้ key เดียวกัน |
No authenticationScheme specified | ลืม app.UseAuthentication() |
ใส่ app.UseAuthentication(); ก่อน app.UseAuthorization(); |
Token lifetime validation failed | Token หมดอายุ | สร้างใหม่ |
✅ 10️⃣ สรุป
หัวข้อ | สรุป |
---|---|
Package | Microsoft.AspNetCore.Authentication.JwtBearer |
หน้าที่ | ตรวจสอบ JWT Token |
ใช้ใน | API ที่ต้อง Login |
ขั้นตอนหลัก | 1. สร้าง Token → 2. แนบใน Header → 3. ตรวจสอบด้วย Middleware |
จุดเด่น | ปลอดภัย, ไม่ต้องใช้ Session, ทำงานข้าม Platform ได้ |
หากคุณต้องการ 👉
ผมสามารถสร้าง โปรเจกต์ ASP.NET Core Web API JWT Authentication แบบครบระบบ
มี Login / Refresh Token / Role / Policy พร้อม Swagger ตัวอย่างให้ใช้งานได้เลย
อยากให้ผมสร้างโปรเจกต์ตัวอย่างแบบนั้นไหมครับ? 😎