Security Uplift — 70 endpoint ที่เปลี่ยนจากเรียกได้โดยไม่ login เป็น 401
ตาราง endpoint ทุกเส้นของ UserService ที่ auth posture เปลี่ยนในรอบ security uplift — 70 เส้นเดิมที่ต้อง login เพิ่ม, 3 เส้นใหม่ของ client-keys และอีก 48 เส้นที่ยังเปิด anonymous อยู่ พร้อมแยกว่าเส้นไหนตั้งใจเปิดกับเส้นไหนแค่ลืมใส่ attribute
อัปเดต: 2026-08-31
← กลับหน้าภาพรวม · นี่คือกลุ่ม 3 กลุ่มเดียวที่เปลี่ยนพฤติกรรมทันทีโดยไม่มี flag คุม
generate จาก diff จริง origin/development...a36f9ce ไม่ได้ไล่อ่านด้วยตา
สรุป
| จำนวน | |
|---|---|
| endpoint เดิมที่เปลี่ยนเป็นต้อง login | 70 |
endpoint ใหม่ (/client-keys) | 3 |
| ยังเรียกได้โดยไม่ login | 48 (ตั้งใจ 27 · ไม่มี attribute 21) |
แยกตาม controller
| controller | เปลี่ยนเป็นต้อง login | ลักษณะ |
|---|---|---|
OnboardingController | 23 | admin flow-instances 14 + onboarding ของ owner 9 |
UserController | 16 | users/me*, settings/me*, POST /users, {oid}/roles |
RoleController | 7 | admin roles |
RolePermissionController | 5 | |
ModeController | 5 | |
PermissionController | 4 | |
RoleModeController | 3 | |
SubscriptionController | 3 | |
ApplicationModeController | 2 | |
EmployeeController | 2 |
🔴 3 จุดที่ต้องดูเป็นพิเศษ
เพราะ caller อาจไม่ใช่เบราว์เซอร์ที่มี session
| endpoint | เดิม | ตอนนี้ |
|---|---|---|
POST ~/users (CreateUser) | [AllowAnonymous] + comment //[RequireApiKey] ค้าง | [Authorize] + เพิ่ม [Consumes("application/json")] |
GET ~/users/{azureObjectId}/roles | [AllowAnonymous] | [Authorize] |
GET ~/employees/by-username, ~/employees/{emp_code} | ไม่มี attribute | [Authorize] |
เรื่อง “ไม่มี attribute” หมายความว่าอะไร
ยืนยันแล้วว่า ไม่มี global fallback policy — grep FallbackPolicy ทั้ง src/ = 0 และ diff รอบนี้ก็ไม่ได้เพิ่ม
⇒ endpoint ที่ไม่มี [Authorize] และไม่มี [AllowAnonymous] = เรียกได้โดยไม่ login จริง ๆ ไม่ใช่ตกไปโดน policy กลาง
จำนวน anonymous-by-omission ขยับจาก 20 ที่รายงานไว้ 28/08 เป็น 21 เพราะ merge development พาเส้นใหม่เข้ามา
⚠️ ถ้าเปิด
ClientSignature.Mode=Enforceเมื่อไหร่ 21 เส้นนี้จะพัง เพราะไม่มี identity ไปเซ็น request — ตอนนี้ flag ปิดจึงยังไม่กระทบ
ก. ตารางเต็ม — เปลี่ยนจากเรียกได้โดยไม่ login → ต้อง login
~ = api/user-service/v{version:apiVersion} · NONE = ไม่มี attribute · ANON = [AllowAnonymous]
-- ApplicationModeController.cs
Get ~/apps/{app_id:guid}/modes GetModes ANON -> AUTH
Patch ~/apps/{app_id:guid}/modes/{mode} SetModeActive ANON -> AUTH
-- ClientKeysController.cs
Get ~/client-keys/ping Ping (new endpoint) -> AUTH
Post ~/client-keys Register (new endpoint) -> AUTH
Post ~/client-keys/echo Echo (new endpoint) -> AUTH
-- EmployeeController.cs
Get ~/employees/by-username GetEmployeeByUsernameAsync NONE -> AUTH
Get ~/employees/{emp_code} GetEmployeeByEmpCodeAsync NONE -> AUTH
-- ModeController.cs
Delete ~/modes/{id:guid} DeleteMode ANON -> AUTH
Get ~/modes GetModes ANON -> AUTH
Get ~/modes/{id:guid} GetModeById ANON -> AUTH
Post ~/modes CreateMode ANON -> AUTH
Put ~/modes/{id:guid} UpdateMode ANON -> AUTH
-- OnboardingController.cs
Get ~/admin/flow-definition-options AdminListFlowDefinitions ANON -> AUTH
Get ~/admin/flow-instances AdminList ANON -> AUTH
Get ~/admin/flow-instances/{id:guid} AdminGet ANON -> AUTH
Get ~/admin/flow-instances/{id:guid}/application-report AdminApplicationReport ANON -> AUTH
Get ~/admin/flow-instances/{id:guid}/edit-history AdminEditHistory ANON -> AUTH
Get ~/admin/flow-instances/{id:guid}/investigation Investigation ANON -> AUTH
Get ~/admin/flow-instances/{id:guid}/step-map AdminStepMap ANON -> AUTH
Get ~/admin/flow-instances/{id:guid}/steps/{stepType}/data AdminStepData ANON -> AUTH
Get ~/onboarding/instances ListMine ANON -> AUTH
Get ~/onboarding/instances/by-ref-no/{refNo} GetByRefNo ANON -> AUTH
Get ~/onboarding/instances/{id:guid} Get ANON -> AUTH
Get ~/onboarding/instances/{id:guid}/edit-history GetEditHistory ANON -> AUTH
Get ~/onboarding/instances/{id:guid}/history GetHistory ANON -> AUTH
Get ~/onboarding/instances/{id:guid}/history/{historyId:guid} GetHistoryDetail ANON -> AUTH
Post ~/admin/flow-instances/search AdminSearchFlowInstances ANON -> AUTH
Post ~/admin/flow-instances/{id:guid}/abandon Abandon ANON -> AUTH
Post ~/admin/flow-instances/{id:guid}/republish-approval Republish ANON -> AUTH
Post ~/admin/flow-instances/{id:guid}/retry-stuck RetryStuck ANON -> AUTH
Post ~/admin/flow-instances/{id:guid}/simulate-approval SimulateApproval ANON -> AUTH
Post ~/admin/flow-instances/{id:guid}/simulate-progress SimulateProgress ANON -> AUTH
Post ~/flow-instances/{id:guid}/transition Transition ANON -> AUTH
Post ~/onboarding/instances/{id:guid}/owner-cancel OwnerCancel ANON -> AUTH
Post ~/onboarding/requestor/start RequestorStart ANON -> AUTH
-- PermissionController.cs
Delete ~/apps/{applicationId:guid}/permissions/{permissionId:guid} DeletePermissionAsync ANON -> AUTH
Get ~/apps/{applicationId:guid}/permissions GetPermissionsAsync ANON -> AUTH
Post ~/apps/{applicationId:guid}/permissions CreatePermissionAsync ANON -> AUTH
Put ~/apps/{applicationId:guid}/permissions/{permissionId:guid} UpdatePermissionAsync ANON -> AUTH
-- RoleController.cs
Delete ~/admin/apps/{app_id}/roles/cancel DeleteRolesAsync ANON -> AUTH
Delete ~/admin/apps/{app_id}/roles/delete HardDeleteRolesAsync ANON -> AUTH
Get ~/admin/apps/{app_id}/roles GetRolesByAppIdAsync ANON -> AUTH
Get ~/admin/companies/{companyId:guid}/apps/{app_id:guid}/roles GetCompanyRolesAsync ANON -> AUTH
Post ~/admin/apps/{app_id}/roles CreateRolesAsync ANON -> AUTH
Post ~/admin/companies/{companyId:guid}/apps/{app_id:guid}/roles CreateCompanyRolesAsync ANON -> AUTH
Put ~/admin/apps/{app_id}/roles UpdateRolesAsync ANON -> AUTH
-- RoleModeController.cs
Delete ~/admin/apps/{app_id}/roles/{role_id}/modes/{mode} RemoveRoleModeAsync ANON -> AUTH
Patch ~/admin/apps/{app_id}/roles/{role_id}/modes/{mode} SetRoleModeActiveAsync ANON -> AUTH
Post ~/admin/apps/{app_id}/roles/{role_id}/modes AssignRoleModeAsync ANON -> AUTH
-- RolePermissionController.cs
Delete ~/apps/{applicationId:guid}/roles/{roleId:guid}/permissions/{permissionId:guid} RemovePermissionFromRoleAsync ANON -> AUTH
Get ~/apps/{applicationId:guid}/roles/{roleId:guid}/permissions GetAllRolePermissionsAsync ANON -> AUTH
Get ~/apps/{applicationId:guid}/roles/{roleId:guid}/permissions GetRolePermissionsAsync ANON -> AUTH
Patch ~/apps/{applicationId:guid}/roles/{roleId:guid}/permissions SyncRolePermissionsAsync ANON -> AUTH
Post ~/apps/{applicationId:guid}/roles/{roleId:guid}/permissions AssignPermissionsToRoleAsync ANON -> AUTH
-- SubscriptionController.cs
Delete ~/subscriptions/delete Unsubscribe NONE -> AUTH
Get ~/subscriptions GetSubscriptions NONE -> AUTH
Post ~/subscriptions/create Subscribe NONE -> AUTH
-- UserController.cs
Delete ~/users/me SoftDeleteUserAsync NONE -> AUTH
Delete ~/users/me/company UnassignCompanyAsync NONE -> AUTH
Delete ~/users/settings/me/profile-photo DeleteUserSettingProfilePhotoAsync NONE -> AUTH
Get ~/users/profile/me GetUserProfileAsync NONE -> AUTH
Get ~/users/profile/me/name GetUserProfileNameAsync NONE -> AUTH
Get ~/users/settings/me GetUserSettingAsync NONE -> AUTH
Get ~/users/settings/me/notifications GetUserSettingNotificationsAsync NONE -> AUTH
Get ~/users/{azureObjectId}/roles GetUserRolesAsync ANON -> AUTH
Patch ~/users/me/active ActiveUserAsync NONE -> AUTH
Patch ~/users/me/kyc-status UpdateKYCStatusAsync NONE -> AUTH
Patch ~/users/settings/me/contact-email UpdateUserSettingContactEmailAsync NONE -> AUTH
Patch ~/users/settings/me/notification/real-time UpdateUserSettingNotificationRealTimeAsync NONE -> AUTH
Patch ~/users/settings/me/notification/via-email UpdateUserSettingNotificationViaEmailAsync NONE -> AUTH
Patch ~/users/settings/me/notification/within-app UpdateUserSettingNotificationWithinAppAsync NONE -> AUTH
Post ~/users CreateUserAsync ANON -> AUTH
Put ~/users/settings/me/profile-photo UploadUserSettingProfilePhotoAsync NONE -> AUTH
ข. ตารางเต็ม — ยังเรียกได้โดยไม่ login (ไม่เปลี่ยนในรอบนี้)
total still-anonymous=48 ANON=27 NO-ATTR=21
NONE AdminOnboardingController.cs Get ~/admin/flow-definitions
NONE AdminOnboardingController.cs Get ~/admin/invitations
NONE AdminOnboardingController.cs Get ~/admin/step-catalogs
NONE AdminOnboardingController.cs Patch ~/admin/flow-definitions/{id}/status
NONE AdminOnboardingController.cs Patch ~/admin/step-catalogs/{id:guid}
NONE AdminOnboardingController.cs Post ~/admin/flow-definitions
NONE AdminOnboardingController.cs Post ~/admin/invitations
NONE AdminOnboardingController.cs Post ~/admin/invitations/{id}/reinvite
NONE AdminOnboardingController.cs Post ~/admin/invitations/{id}/revoke
NONE AdminOnboardingController.cs Put ~/admin/flow-definitions/{id}
ANON AgreementsController.cs Get ~/agreements/latest
ANON AntiforgeryController.cs Get ~/antiforgery-token
ANON CompanyController.cs Get ~/companies/cust-codes
NONE EmployeeController.cs Get ~/employees/by-email
NONE EmployeeController.cs Get ~/employees/by-role/{role_id}
ANON LineConnectivityController.cs Get ~/line-connectivity/instances/{id:guid}
ANON LineConnectivityController.cs Post ~/line-connectivity/instances/{id:guid}/steps/{stepType}
ANON LineConnectivityController.cs Post ~/line-connectivity/register/start
ANON LineConnectivityController.cs Post ~/line-connectivity/unsubscribe/start
ANON OnboardingController.cs Get ~/onboarding/flows/{code}
ANON OnboardingController.cs Get ~/onboarding/instances/{id:guid}/application-pdf
ANON OnboardingController.cs Get ~/onboarding/juristic/{juristicId}/availability
ANON OnboardingController.cs Post ~/onboarding/flows/{flowCode}/access
ANON OnboardingController.cs Post ~/onboarding/instances
ANON OnboardingController.cs Post ~/onboarding/instances/{id:guid}/discard
ANON OnboardingController.cs Post ~/onboarding/instances/{id:guid}/open
ANON OnboardingController.cs Post ~/onboarding/instances/{id:guid}/steps/{stepType}/actions/{actionCode}
ANON OnboardingController.cs Post ~/onboarding/validate-invite
NONE OnboardingController.cs Get ~/admin/flow-instances/by-ref-no/{refNo}
NONE OnboardingController.cs Get ~/onboarding/instances/{id:guid}/step-map
NONE OnboardingController.cs Get ~/onboarding/instances/{id:guid}/steps/{stepType}/data
ANON RoleModeController.cs Get ~/apps/{app_id}/modes/{mode}/roles
ANON SecurityController.cs Get ~/security/jwks
ANON SubscriptionController.cs Delete ~/subscriptions/unsubscribe
ANON SubscriptionController.cs Get ~/subscriptions/users
ANON SubscriptionController.cs Get ~/subscriptions/verify-token
ANON SubscriptionController.cs Post ~/subscriptions/tokens/batch
ANON TokenIssuanceController.cs Post ~/token-issuance/on-token-issuance-start
ANON UserCacheController.cs Delete ~/cache/users/{userId:guid}
ANON UserCacheController.cs Post ~/cache/users/refresh/{userId:guid}
ANON UserCacheController.cs Post ~/cache/users/warm/{oid}
ANON UserController.cs Get ~/users/active-ids
NONE UserController.cs Get ~/users/me
NONE UserController.cs Get ~/users/me/details
NONE UserController.cs Get ~/users/{id}/name
NONE UserController.cs Patch ~/users/settings/me/phone
NONE UserController.cs Post ~/users/name
NONE UserController.cs Put ~/users/me