การใช้งาน JWT Token Authentication ใน ASP.NET Core กับ MySQL

Sept. 29, 2024 · boychawin

ช่วงนี้ผมมีโอกาสได้ไปฝึกเจ้า ASP.NET Core 8 เพื่อเอาไปใช้งานกับโปรเจกต์ใหม่ที่บริษัท ในหลายๆหัวข้อที่ฝึก แต่วันนี้จะมาแชร์ในหัวข้อ

การใช้ JWT (JSON Web Token) Token Authentication เป็นวิธีที่ได้รับความนิยมในการจัดการความปลอดภัยและการยืนยันตัวตนในแอปพลิเคชันเว็บ ด้วยการใช้ JWT เราสามารถสร้างระบบที่ปลอดภัยสำหรับการเข้าถึง API และ Service ต่างๆ ในแอปพลิเคชันของเรา ในบทความนี้จะพามาทำระบบ JWT Authentication ใน ASP.NET Core โดยใช้ MySQL เป็นฐานข้อมูลครับ

ขั้นตอนการติดตั้ง

ต้องมีการสร้างโปรเจกต์ไว้แล้วนะครับ และให้ทำการติดตั้งแพ็กเกจที่จำเป็นโดยใช้คำสั่งต่อไปนี้ใน Command Line


# ตั้งค่า ASPNETCORE_ENVIRONMENT=Development

dotnet add package Microsoft.EntityFrameworkCore
dotnet add package BCrypt.Net
dotnet add package Pomelo.EntityFrameworkCore.MySql
dotnet add package System.IdentityModel.Tokens.Jwt
dotnet add package Microsoft.IdentityModel.Tokens
dotnet add package Microsoft.EntityFrameworkCore.Design

การตั้งค่าการเชื่อมต่อ MySQL ในไฟล์ appsettings.json

ให้เพิ่มการตั้งค่าการเชื่อมต่อฐานข้อมูล MySQL ลงในไฟล์ appsettings.json ของคุณ


{
...
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Port=3306;Database=mydatabase;Uid=root;Pwd=root;"
  },
  "AppSettings": {
    "Secret": "YourSuperSecretKeyHereWithAtLeast16Chars",
    "RefreshTokenTTL": 2
  }
}

การสร้าง Migration

หลังจากติดตั้งแพ็กเกจแล้ว ให้สร้างการ Migration เพื่อสร้างโครงสร้างของฐานข้อมูล


# dotnet ef migrations remove 
dotnet ef migrations add InitialCreate
dotnet ef database update

การตั้งค่า WebApplication

  1. การสร้าง WebApplication เริ่มต้นสร้าง WebApplication ด้วย WebApplication.CreateBuilder(args).

  2. การตั้งค่า Service Container เพิ่ม DbContext และลงทะเบียนบริการที่จำเป็น

    
    services.AddDbContext<DataContext>();
    services.AddCors();
    services.AddControllers().AddJsonOptions(x =>
    {
        x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
        x.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
        x.JsonSerializerOptions.WriteIndented = true;
        x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
    });
    services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));
    services.AddScoped<IJwtUtils, JwtUtils>();
    services.AddScoped<IUserService, UserService>();
    
    
  3. การตั้งค่า Swagger

    เพื่อให้สามารถทดสอบ API ได้ง่ายขึ้น เพิ่ม Swagger

    
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    
    
  4. การสร้าง WebApplication

    สร้างแอปพลิเคชันจากการตั้งค่าที่ได้ทำไว้แล้ว

    
    var app = builder.Build();
    
  5. การ Seed ข้อมูลใน Database กำหนดให้เพิ่มผู้ใช้ทดสอบเมื่อเริ่มต้นแอปพลิเคชัน:

    
    using (var scope = app.Services.CreateScope())
    {
        var context = scope.ServiceProvider.GetRequiredService<DataContext>();
        context.Database.EnsureDeleted();
        context.Database.Migrate();
    
        var testUser = new User
        {
            FirstName = "Test",
            LastName = "Test",
            Username = "test",
            PasswordHash = BCrypt.Net.BCrypt.HashPassword("test")
        };
        context.Users.Add(testUser);
        context.SaveChanges();
    }
    
    
  6. การตั้งค่า Middleware กำหนดให้ใช้ CORS และ JWT Authentication

    
    app.UseCors(x => x.AllowAnyMethod().AllowAnyHeader().AllowCredentials());
    app.UseMiddleware<ErrorHandlerMiddleware>();
    app.UseMiddleware<JwtMiddleware>();
    app.MapControllers();
    
  7. การตั้งค่าสำหรับสภาพแวดล้อมการพัฒนา เปิดใช้งาน Swagger ในโหมดการพัฒนา

    
    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();
        app.UseSwaggerUI();
    }
    
  8. การใช้ HTTPS Redirection ใช้ HTTPS Redirection เพื่อความปลอดภัย

    
        app.UseHttpsRedirection();
        app.Run();
    

สรุป

การตั้งค่าใช้งานโปรเจกต์ JWT Token Authentication ใน ASP.NET Core โดยใช้ MySQL เป็นฐานข้อมูล ตั้งแต่การติดตั้งแพ็กเกจจนถึงการตั้งค่าการเชื่อมต่อฐานข้อมูลและการสร้าง API สำหรับการจัดการผู้ใช้ การใช้ JWT ช่วยให้เราสามารถรักษาความปลอดภัยของ API และจัดการการเข้าถึงได้อย่างมีประสิทธิภาพ

Source code

โค้ดทั้งหมดจะถูกจัดเก็บไว้ใน Github นี้ Link Github