AtlasX Web Service ใช้ OAuth 2.0 ร่วมกับ JWT สำหรับการยืนยันตัวตน
การตั้งค่า
กำหนดค่า OAuth ใน appsettings.json
{
"App": {
"OAuth": {
"AccessTokenExpires": 300,
"RefreshTokenExpires": 604800,
"AuthorizationCodeExpires": 300,
"Issuer": "https://localhost:5001",
"SecretKey": "your-secret-key",
"MultiRefreshToken": true,
"VerifyCodeExpires": 900
}
}
}Issuer— URL ของ Authorization ServerSecretKey— key สำหรับ sign JWTAccessTokenExpires— อายุ Access Token (วินาที)RefreshTokenExpires— อายุ Refresh Token (วินาที)AuthorizationCodeExpires— อายุ Authorization Code (วินาที)VerifyCodeExpires— อายุ Verify Code (วินาที)
Authentication Service Registration
ลงทะเบียน Authentication เข้า DI container ใน Program.cs
builder.Services.AddOAuth(builder.Configuration);
builder.Services.AddAuth(builder.Configuration);รายการ Endpoint ที่ให้บริการ
AppLoginController
สำหรับการ login / logout และจัดการ session ของผู้ใช้บนหน้าเว็บ โดยมีรายละเอียด ดังนี้
| Method | Endpoint | Description |
| GET | /config | ดึง application configuration จากฐานข้อมูล |
| GET | /login | แสดงหน้า login ถ้า login อยู่แล้วจะ redirect ไปหน้าหลัก |
| POST | /login | ตรวจสอบ credentials สร้าง session และ set cookie |
| POST | /logout | ลบ session และ cookie แล้วออกจากระบบ |
AuthenController
OAuth 2.0 endpoints สำหรับ login, token และการจัดการ session
| Method | Endpoint | Description |
| GET | /authen/authorize | ขอ Authorization Code (ต้อง login ก่อน) |
| POST | /authen/token | แลก Authorization Code หรือ Refresh Token เพื่อรับ Access Token |
| GET | /authen/userinfo | ดึงข้อมูล user จาก Access Token (ต้องมี Bearer token) |
| POST | /authen/revoke | ยกเลิก token ที่ไม่ต้องการใช้แล้ว |
| GET | /authen/endsession | ออกจากระบบและลบ cookie พร้อม redirect |
| POST | /authen/verify | ส่ง verification code ผ่าน email สำหรับ register หรือ forget password |
SessionService
จัดการ session ของผู้ใช้โดยเก็บข้อมูลใน distributed cache (Redis) session โดยแต่ละตัวจะถูก identify ด้วย sessionId ที่มีอายุและสามารถกำหนดอายุได้
SessionService Registration
กำหนดค่า SessionService ใน Program.cs โดยเพิ่ม Redis cache และ SessionService เข้า DI container ดังนี้
builder.Services.AddCache(builder.Configuration.GetSection("Redis")["ConnectionString"]);
builder.Services.AddScoped<SessionService>();จากนั้น inject SessionService เข้า class ที่ต้องการใช้งานผ่าน constructor
public class MyService
{
private readonly SessionService _session;
public MyService(SessionService session)
{
_session = session;
}
}Methods
| Name | Returns | Description |
CreateSession(String, SessionData, TimeSpan) | void | สร้าง session ใหม่และบันทึกลงใน cache |
GetSession(String) | SessionData? | ดึงข้อมูล session จาก sessionId |
RefreshSession(String, SessionData, TimeSpan) | void | อัปเดตข้อมูลและต่ออายุ session |
RemoveSession(String) | void | ลบ session ออกจาก cache |
RotateSession(String, SessionData, TimeSpan, TimeSpan) | string? | สร้าง session ใหม่และยกเลิกตัวเดิม |
Session Data
ข้อมูลที่เก็บใน session ประกอบด้วย
| Field | Description |
UserId | ID ของผู้ใช้ |
Role | รายการ role ของผู้ใช้ |
Permission | รายการ permission ในรูปแบบ roleId:functionId = view,edit |
ExpiresAt | เวลาหมดอายุของ session |
IsRotated | บอกว่า session นี้ถูก rotate ไปแล้วหรือยัง |