Azure CLI az login 訂閱選擇器:觸發條件、關閉方式與快速登入
az login 結尾出現 [Announcements] With the new Azure CLI login experience... 不是錯誤,而是 Azure CLI 2.61.0 起預設開啟的訂閱選擇器。只想沿用上次的訂閱就直接按 Enter;想跳過選擇就在登入時用 --subscription 指定;需要完全回到舊行為時,把 core.login_experience_v2 設為 off。
公告與選擇器長什麼樣子
互動登入完成後,Azure CLI 會列出可用的 tenant 與 subscription,等你輸入編號:
選完後會印出 [Announcements] 公告,再加一行 [Warning] The login output has been updated... ,提醒登入輸出不再預設列出完整訂閱清單。
選擇器的細節:
清單依 subscription 名稱排序,名稱超過 36 個字元會截斷。
*標示目前的預設訂閱,也就是上次選過的訂閱;直接按 Enter 代表不變更。輸入不存在的編號會顯示
Invalid selection.並重新詢問。沒有 tenant 顯示名稱時,
Tenant欄位改顯示 tenant ID。
什麼時候會出現選擇器
依 az login 的原始碼,必須同時符合以下三個條件才會顯示選擇器:
使用者互動登入:瀏覽器 authorization code flow 或 device code flow。
stdin 與 stdout 都是 TTY,也就是沒有被 pipe、重導或用
$(...)擷取。core.login_experience_v2沒有被關閉;未設定時預設為開啟。
登入方式或參數 | 是否顯示選擇器 |
|---|---|
| 會,即使只有 1 個訂閱也會顯示 |
| 會,只列出該 tenant 的訂閱 |
| 只有符合的訂閱超過 1 個時才會 |
| 不會,只建立 tenant 層級帳戶 |
| 不會 |
用 | 不會,stdout 不是 TTY,照舊輸出 JSON |
| 不會,照舊輸出 JSON |
Microsoft Learn 寫到「某些環境」要先關閉選擇器才能使用 --tenant ,但沒有說明是哪些環境。從 2.90.0 原始碼看, --tenant 與選擇器可以同時使用,提示文字會改成 Retrieving subscriptions for the selection...。
對腳本與 CI 的影響
擷取
az login輸出的腳本不受影響:stdout 不是 TTY 時,選擇器會自動略過,仍回傳 JSON 陣列。直接在終端機執行、又沒有擷取輸出的腳本,會停在選擇提示等待輸入。需要無人值守時,改用
--subscription或關閉選擇器。CI 應改用 service principal、managed identity 或 workload identity federation,本來就不會出現選擇器。
登入後要取得目前訂閱,改用
az account show,不要依賴az login在終端機印出的內容。
只想在單次執行或 CI job 關閉時,可以依 Azure CLI 的 AZURE_{section}_{name} 環境變數命名規則設定:
指定訂閱與略過訂閱探索
Azure CLI 2.86.0 為 az login 新增 --subscription 與 --skip-subscription-discovery ,可以在登入時決定預設訂閱,或減少登入時的 ARM API 呼叫。
使用限制:
--skip-subscription-discovery必須搭配--tenant,否則直接報錯。與
--skip-subscription-discovery一起使用時,--subscription必須是 GUID,不能用名稱。只用
--subscription時可以填 ID 或名稱;找不到時會出現Subscription '<value>' not found。搭配
--skip-subscription-discovery卻無法取得指定訂閱時會報錯;若另外加上--allow-no-subscriptions,則只留下 tenant 層級帳戶並顯示警告。
常用設定與指令
需求 | 指令 |
|---|---|
永久關閉選擇器 |
|
重新開啟選擇器 |
|
查看目前設定 |
|
登入後切換訂閱 |
|
重新整理訂閱清單 |
|
確認目前訂閱 |
|
az account clear 會清掉本機的訂閱快取,執行後在重新登入前無法使用需要訂閱的指令。
認證 broker 是什麼
認證 broker(authentication broker)是裝在電腦上的獨立程式或系統元件,專門替其他程式處理 Microsoft Entra ID 登入並保管 token。啟用後, az 不再自己開瀏覽器、自己保存 refresh token,而是向 broker 要一張可存取 Azure 的短效 access token。
項目 | 沒有 broker | 有 broker |
|---|---|---|
誰向 Entra ID 登入 |
| broker 處理, |
長效憑證存放位置 |
| broker 保管,可用時綁定裝置的硬體金鑰 |
單一登入(SSO) | 每個工具各自登入 | Edge、Teams、 |
「需要合規裝置」的 Conditional Access | 不容易證明是哪台裝置 | broker 會提供裝置憑證 |
token 快取檔被複製到其他電腦 | 可能繼續被使用 | 綁定硬體金鑰時,搬到別台也無法使用 |
broker 的核心是 Primary Refresh Token(PRT)。裝置註冊到 Microsoft Entra ID 後,broker 會取得 PRT,並把它和裝置金鑰綁在一起:Windows 在有可用 TPM 時由 TPM 保護,macOS 則使用 Secure Enclave(Platform SSO 與新的裝置註冊預設啟用)。之後其他程式需要 token 時,broker 用 PRT 換出短效 access token;在 MDM 管理的 Mac 上,broker 只把 access token 交給呼叫的程式。登入一次就能跨程式共用,外洩的也只會是短效 token。
各平台的 broker:
Windows :Web Account Manager(WAM),Windows 10 與 Windows Server 2019 以上內建;Azure CLI 2.61.0 起預設使用。遇到
User cancelled the Accounts Control Operation這類問題時,可先執行az account clear,再用az config set core.enable_broker_on_windows=false改回瀏覽器登入。macOS :系統不內建,由 Intune Company Portal 內含的 Microsoft Enterprise SSO plug-in 提供,Azure CLI 2.91.0 起可選用,詳見下一節。
Linux :MSAL Python 也支援 Linux broker,但 Azure CLI 2.91.0 只提供 Windows 與 macOS 的 broker 設定。
macOS 認證 broker(2.91.0 預覽)
先確認這台 Mac 有可用的 broker。依 Microsoft Entra 文件,Microsoft Enterprise SSO plug-in 需要同時符合:
已安裝 Intune Company Portal,macOS 10.15 以上。
裝置已加入 MDM,例如 Microsoft Intune。
MDM 已推送啟用 SSO plug-in 的設定檔。
這項功能主要是給公司以 MDM 管理的 Mac 使用。沒有 Company Portal、也沒有加入 MDM 的個人 Mac 沒有 broker 可用,維持預設的瀏覽器登入即可。
Azure CLI 2.91.0 新增 macOS 的 broker-based authentication 預覽,預設關閉,需要自行開啟:
開啟前要先安裝 Microsoft Company Portal 這類相容的 broker;依官方文件,沒有安裝 broker 時會改回瀏覽器登入。要恢復預設行為:
使用 Homebrew 安裝時要先確認安裝來源:
這項功能的 PR 說明 Homebrew formula 只依賴一般的 msal ,刻意不包含 broker 需要的 pymsalruntime ;Homebrew cask 與 pip 安裝才會帶上 msal[broker] 。MSAL Python 文件寫明,未安裝 broker 相關套件卻啟用 broker 時會得到 ImportError ;MSAL 1.36.0 初始化 broker 時只攔截 RuntimeError ,Azure CLI 2.91.0 的 identity.py 也沒有另外處理。
依此推論,formula 版開啟 core.enable_broker_on_mac 後, az login 很可能直接報出缺少 msal[broker] 的錯誤,而不是改回瀏覽器登入;這點尚未實測。想試用 macOS broker,建議改用 cask 版或 pip 安裝的 Azure CLI。
本機 token 快取
沒有使用 broker 時, az 會把 MSAL token 快取存在 AZURE_CONFIG_DIR ,預設是 ~/.azure 。依 Azure CLI 原始碼的 should_encrypt_token_cache() ,只有 Windows 預設加密這份快取(msal_token_cache.bin );macOS 與 Linux 是明文的 msal_token_cache.json ,檔案權限為 600。
不要把
~/.azure同步到雲端硬碟、放進備份壓縮檔或打包進容器映像。交還共用電腦或拆除臨時環境前,先執行
az logout或az account clear清掉登入狀態。