Authentication with OAuth 2.0

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
    }
  }
}
  1. Issuer — URL ของ Authorization Server
  2. SecretKey — key สำหรับ sign JWT
  3. AccessTokenExpires — อายุ Access Token (วินาที)
  4. RefreshTokenExpires — อายุ Refresh Token (วินาที)
  5. AuthorizationCodeExpires — อายุ Authorization Code (วินาที)
  6. 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 ของผู้ใช้บนหน้าเว็บ โดยมีรายละเอียด ดังนี้

MethodEndpointDescription
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

MethodEndpointDescription
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

NameReturnsDescription
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 ประกอบด้วย

FieldDescription
UserIdID ของผู้ใช้
Roleรายการ role ของผู้ใช้
Permissionรายการ permission ในรูปแบบ roleId:functionId = view,edit
ExpiresAtเวลาหมดอายุของ session
IsRotatedบอกว่า session นี้ถูก rotate ไปแล้วหรือยัง