本卡屬 FR-166(母卡 CM-3109 延伸),決策者 2026-10-28 手測發現。主 repo(compliance-manager-be)+ jedi-remote-agent 套件(path dependency 開發、不發版)。同批另有排程去重與第三方元件合併卡,不改同一個檔。
白話
主控台用「AD / LDAP」分頁登不進去。查到的原因:主系統登入 AD 時,是用 AD 的 objectGUID 對到主系統帳號(user_auth_providers.provider_user_id),所以主系統帳號 blsadmin 可以綁 AD 帳號 JEDICOGY\raymond。但心跳下發給 Agent 的離線操作者名單只有 sub=login_name(blsadmin),Agent 就拿 JEDICOGY\blsadmin 去問 AD,AD 根本沒這個帳號,當然被拒。只要主系統帳號跟 AD 帳號不同名,Agent 的 AD 登入就一律失敗;本機實測:AD 查 blsadmin → 無,查 raymond → GUID 4bdde273… 正好等於 blsadmin 那筆綁定的 provider_user_id。
要改成:名單下發時,每個人多帶一欄 ad_account(主系統上綁定的 AD 帳號,含網域前綴);沒綁 AD 的人這欄為 null。Agent 端(另一張卡)用這欄問 AD;沒有就只准離線密碼。
問題在哪
- jedi-remote-agent
app/service/offline_operator_service.py 第 85~105 行 roster():每人只放 sub/display_name/scope/expires_at/revoked。
- 宿主
core/plugins/_agent_offline_operators.py resolve_user() 只回 login_name 與 display_name;套件 port domain/offline_operator/repository/user_directory.py 的 docstring 也只定義這兩欄。
- 主系統綁定存在 jedi-iam 的 user_auth_providers(provider='ldap',provider_user_id=AD objectGUID),表裡沒有 AD 帳號名;jedi-iam
infra/adapter/authenticate_adapter/ldap/ldap_adapter.py _bound_user 用 GUID 查。
怎麼做
- 【決定要下發什麼】下發 AD 帳號名(含網域,例 JEDICOGY\raymond),不是 GUID。理由:Agent 的 AD 登入是 NTLM bind(jedi-ldap verify_user 註明「bind 本身就是驗密碼、沒有第二段可查 DN」),bind 要的是帳號不是 GUID;離線時 Agent 也不一定有服務帳號能用 GUID 反查。
- 【extend jedi-iam 綁定時存帳號名】user_auth_providers 現在只有 provider_user_id(GUID)。查既有欄位與 UserAuthProviderEntity,若沒有能放帳號名的欄位,在 jedi-iam 加 provider_login(VARCHAR(255),nullable)+套件 migration,LDAP 綁定(ldap_adapter 建 UserAuthProvider 那段)與每次 LDAP 登入成功時一併寫入/更新 directory_user.username(含網域前綴照 AD 回的 sAMAccountName 組,與 jedi-ldap DirectoryUser.username 同源)。舊綁定沒這欄的人,下一次用 AD 登主系統就補上;沒再登過的人 ad_account 為 null,Agent 只准離線密碼(卡上手測要涵蓋)。
- 【extend 套件 port】user_directory.resolve_user 回傳 dict 多一鍵 ad_account(str|None),docstring 補定義;roster() 每人多帶 ad_account。套件 tests 補「有綁定帶帳號、沒綁定為 None」。
- 【extend 宿主】_agent_offline_operators.resolve_user:經 jedi-iam user_auth_provider_domain_service.get_user_auth_provider(UserAuthProviderQueryEntity(user_id=…, provider='ldap')) 取綁定,回 provider_login;不直接 import ORM model。DI 從既有 auth_container 拿。
- 【extend FE 一點點,可併進 FE 卡】Agent 管理頁離線操作者對話框(src/views/remote-agent/OfflineOperatorsDialog.vue)每人顯示「AD 帳號:xxx/未綁定 AD」,讓管理員授權時就看得出這人能不能用 AD 登 Agent。清單端點若沒回這欄要一起補。
- 【不做】Agent 端收這欄並拿去問 AD,是 Agent 卡;用 email 或其他欄位猜 AD 帳號,不做(猜錯等於把別人的 AD 帳號綁到這個人)。
改哪些檔
- ~/Projects/Jedicogy/module/jedi-python-package/jedi-remote-agent/jedi_remote_agent/app/service/offline_operator_service.py、domain/offline_operator/repository/user_directory.py、tests/
- ~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/infra/adapter/authenticate_adapter/ldap/ldap_adapter.py、domain/entities/user_auth_provider*.py、infra/models/user_auth_provider.py、migrations/(新欄位)
- core/plugins/_agent_offline_operators.py(135 行)
- api/remote_agent/ 離線操作者清單的 schema/serializer(回 ad_account)