PlusMagi's Blog By Pitt Phunsanit Backend,Cybersecurity ASP.NET Core Security: การทำ Authentication & Authorization ด้วย JWT Bearer Tokens และ Identity

ASP.NET Core Security: การทำ Authentication & Authorization ด้วย JWT Bearer Tokens และ Identity

ในยุคที่สถาปัตยกรรมซอฟต์แวร์ถูกออกแบบให้เป็นแบบ Microservices และการสื่อสารระหว่างบริการต่างๆ เกิดขึ้นผ่าน API อย่างต่อเนื่อง การรักษาความปลอดภัยแบบดั้งเดิมที่ต้องอาศัย Session บนเซิร์ฟเวอร์จึงไม่ตอบโจทย์อีกต่อไป องค์กรจึงต้องปรับใช้กลไกการยืนยันตัวตน (Authentication) และการกำหนดสิทธิ์ (Authorization) ที่มีความยืดหยุ่นและไร้สถานะ (Stateless) เพื่อรองรับระบบที่กระจายตัว

🔑 หลักการทำงานของ JWT และ ASP.NET Core Identity

หัวใจสำคัญของการรักษาความปลอดภัยใน ASP.NET Core คือการใช้ **JWT (JSON Web Token)** ซึ่งเป็นมาตรฐานในการส่งข้อมูลที่เข้ารหัสแบบ Base64 และมีการลงนามดิจิทัล (Signed) ทำให้เราสามารถสร้างระบบที่ไม่ต้องพึ่งพา Session บนเซิร์ฟเวอร์ได้อีกต่อไป เมื่อผู้ใช้ล็อกอินสำเร็จ ระบบจะออก Access Token ให้แทนการเก็บสถานะไว้ในหน่วยความจำ (Memory)

ในขณะที่ **ASP.NET Core Identity** ทำหน้าที่เป็นกลไกที่ทรงพลังในการจัดการวงจรชีวิตของผู้ใช้งาน (User Lifecycle) ตั้งแต่การลงทะเบียน การเข้ารหัสรหัสผ่าน ไปจนถึงการกำหนดบทบาท (Roles) และสิทธิ์ (Claims) ส่วน JWT Bearer Token จะทำหน้าที่เป็น ‘บัตรประจำตัวดิจิทัล’ ที่ถูกส่งไปกับทุกคำขอ API ทำให้ Backend สามารถตรวจสอบได้ทันทีว่าผู้ที่เรียกใช้บริการนั้นคือใครและมีสิทธิ์อะไร โดยไม่ต้อง Query ฐานข้อมูลเพื่อเช็คสถานะซ้ำๆ ทุกครั้ง

⚙️ การตั้งค่า Authentication Flow (C# Code Example)

การผสานรวม JWT และ Identity ใน ASP.NET Core นั้นทำได้โดยการตั้งค่า Middleware ในไฟล์ Program.cs เพื่อให้ระบบรับรองความถูกต้องของ Token ที่เข้ามา:

C#

// 1. Add Identity Services and Configure JWT Bearer Authentication
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            Issuer = "https://your-issuer",
            Audience = "https://your-api",
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourSuperSecretKeyForSigning"))
        };
    });

// 2. Use Authentication Middleware
app.UseAuthentication();
app.UseAuthorization();

<0xF0><0x9F><0x97><0x84>️ การจัดการข้อมูลสิทธิ์ด้วย PostgreSQL

แม้ว่าการจัดการ Token จะเกิดขึ้นในระดับแอปพลิเคชัน (C#) แต่ข้อมูลพื้นฐานเกี่ยวกับผู้ใช้ บทบาท และสิทธิ์ (Claims) จะถูกจัดเก็บในฐานข้อมูล ซึ่งในกรณีนี้เราใช้ PostgreSQL ในการจัดเก็บข้อมูลผู้ใช้และบทบาทต่างๆ ตัวอย่างนี้แสดงให้เห็นว่าเราจะดึงข้อมูลสิทธิ์ของผู้ใช้ที่ล็อกอินมาเพื่อตรวจสอบความถูกต้องของ Role:

SQL

-- ตรวจสอบสิทธิ์ (Roles) ของผู้ใช้ที่มี User ID = 123
SELECT
    u.user_id,
    u.username,
    r.role_name,
    r.description
FROM
    user_profiles u
JOIN
    user_roles ur ON u.user_id = ur.user_id
JOIN
    roles r ON ur.role_id = r.role_id
WHERE
    u.user_id = 123;

-- ตัวอย่างผลลัพธ์ที่ได้: (แสดงว่าผู้ใช้มีสิทธิ์ 'Admin' และ 'Editor')
-- | user_id | username | role_name | description |
-- | 123     | john.doe | Admin     | Full system access |
-- | 123     | john.doe | Editor    | Can modify content only |

✅ บทสรุป: ความปลอดภัยที่ยืดหยุ่นและขยายได้

การผสานรวม ASP.NET Core Identity เข้ากับ JWT Bearer Tokens ทำให้เราสามารถสร้างระบบที่มีความปลอดภัยสูง (Secure) และมีความยืดหยุ่นในการขยายตัว (Scalable) อย่างมาก เนื่องจากระบบทั้งหมดทำงานแบบ Stateless ทำให้แต่ละ Microservice สามารถตรวจสอบสิทธิ์ได้ด้วยการตรวจสอบ Token เท่านั้น โดยไม่ต้องพึ่งพาการเชื่อมต่อสถานะ (Session) กับเซิร์ฟเวอร์ส่วนกลางตลอดเวลา การใช้ PostgreSQL ในการจัดเก็บข้อมูลพื้นฐานอย่าง Roles และ Claims ควบคู่ไปกับกลไกของ JWT ทำให้เราได้ระบบรักษาความปลอดภัยที่ทันสมัยและพร้อมรองรับการเติบโตขององค์กรในอนาคต

Exit mobile version