MyWorkItem Backend 是 .NET 10 ASP.NET Core Web API。資料存取採 Dapper+SqlKata,Schema 由 DbUp 管理,驗證採 JWT Access/Refresh Cookie,所有 unsafe request 需通過 CSRF。
cp .env.example .env
# 修改 .env 中的 SA 密碼、應用程式連線密碼、JWT Key 與種子帳號密碼
docker compose up --build啟動後:
- Health:http://localhost:5080/health
- Swagger UI:http://localhost:5080/swagger
- OpenAPI JSON:http://localhost:5080/swagger/v1/swagger.json
Development/Test Seeder 會建立 Admin、Manager、Worker;密碼來自 .env 的 SEED_*_PASSWORD。若未設定,僅 Development/Test 使用 .env.example 所示的示範預設值。Production 不執行此 Seeder。
IDE 不會自動讀取 Compose 的 .env。先啟動資料庫與 Migrator:
docker compose up sqlserver sqlserver-init migrator再於 Rider Run Configuration 或 User Secrets 設定:
ConnectionStrings__DefaultConnection=Server=localhost,14333;Database=MyWorkItem;User Id=myworkitem;Password=<本機應用程式密碼>;Encrypt=True;TrustServerCertificate=True
Jwt__SigningKey=<至少 32 bytes 的本機 Key>
Swagger__Enabled=true
不要把上述實際值寫入 appsettings*.json 或提交 .env。
Compose 以符合 SQL Server 原則的 sa 密碼初始化容器,再建立僅供本機測試的
myworkitem Login。API、Migration 與 IDE 應使用 MSSQL_APP_PASSWORD,不直接使用 sa。
Swagger 頁面會取得 XSRF-TOKEN,每次 POST/PUT/PATCH/DELETE 前重新取得與目前登入身分相符的 Token,並自動加入 X-CSRF-TOKEN。執行 /api/v1/auth/login 後,瀏覽器會自行攜帶 HttpOnly JWT/Refresh Cookie,不需複製 JWT。
dotnet restore
dotnet build --no-restore
dotnet test --no-build
dotnet format --verify-no-changes
docker compose --env-file .env.example config完整 Docker 驗證使用 docker compose up --build;不會自動刪除 SQL Server Volume。
- Production 強制不公開 Swagger,即使
Swagger:Enabled=true。 - CORS 只接受
Cors:AllowedOrigins,並允許 Credentials;不得設成*。 - Access Token 15 分鐘、Refresh Token 7 天且每次輪替;重播舊 Token 會撤銷整個 Family。
- Response DTO 不包含 Password、PasswordHash、Refresh Token 或 Token Hash。