Private Docs

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 เดิมที่เปลี่ยนเป็นต้อง login70
endpoint ใหม่ (/client-keys)3
ยังเรียกได้โดยไม่ login48 (ตั้งใจ 27 · ไม่มี attribute 21)

แยกตาม controller

controllerเปลี่ยนเป็นต้อง loginลักษณะ
OnboardingController23admin flow-instances 14 + onboarding ของ owner 9
UserController16users/me*, settings/me*, POST /users, {oid}/roles
RoleController7admin roles
RolePermissionController5
ModeController5
PermissionController4
RoleModeController3
SubscriptionController3
ApplicationModeController2
EmployeeController2

🔴 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 policygrep 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