針對前一篇文章,針對 DefaultAzureCredential 做深入一點的探討,並且解決實做上可能遇到的情境的解決方式。
前言
針對前一篇文章,針對 DefaultAzureCredential 做深入一點的探討,並且解決實做上可能遇到的情境的解決方式。
說明
根據官方文件說明 DefaultAzureCredential
會按照如下圖順序使用對應的類別來做身份的識別,前一篇就是使用 Visual Studio (VisualStudioCredential) 裡面的設定來做身份的識別。

而 Credential 也包含了底下實做,如果想要直接指定特定的方式就可以直接使用底下類別,或是透過 DefaultAzureCredentialOptions 設定要使用的方式。
- EnvironmentCredential
- ManagedIdentityCredential
- SharedTokenCacheCredential
- VisualStudioCredential
- VisualStudioCodeCredential
- AzureCliCredential
- InteractiveBrowserCredential
var options = new DefaultAzureCredentialOptions();
options.ExcludeEnvironmentCredential = true;
options.ExcludeManagedIdentityCredential = false;
options.ExcludeSharedTokenCacheCredential = false;
options.ExcludeVisualStudioCredential = true;
options.ExcludeVisualStudioCodeCredential = false;
options.ExcludeAzureCliCredential = false;
options.ExcludeInteractiveBrowserCredential = false;
var secretClient = new SecretClient(new Uri(keyVaultUrl), new DefaultAzureCredential(options));
EnvironmentCredential
EnvironmentCredential 會針對設定會按照底下情境的環境變數來做設定。
Service principal with secret (服務主體和秘密)
變數名稱 | 說明 |
AZURE_CLIENT_ID | AAD 內的應用程式 ID |
AZURE_TENANT_ID | AAD 所在的 Tenant ID |
AZURE_CLIENT_SECRET | AAD 內的應用程式 Serect |
此為在 AAD 底下設定一組應用程式和金鑰,並且設定此組應用程式到 KeyVault 的存取原則內。

建立完成之後可以在底下位置取得對應的參數值。

產生和取得秘密 (Secret)


設定到存取原則內
這邊就不另外說明,參照之前文章設定服務主體和可以存取的原則。

Service principal with certificate (服務主體和證書)
變數名稱 | 說明 |
AZURE_CLIENT_ID | AAD 內的應用程式 ID |
AZURE_TENANT_ID | AAD 所在的 Tenant ID |
AZURE_CLIENT_CERTIFICATE_PATH | 包含私鑰且使用 PEM 編碼方式的憑證路徑(無密碼保護) |
這一項目和上一項差別僅在產生秘密那邊改上傳憑證檔案,設定上則是設定憑證路徑。
Username and password (使用者帳號和密碼)
變數名稱 | 說明 |
AZURE_CLIENT_ID | AAD 內的應用程式 ID |
AZURE_USERNAME | 登入 Azure 的帳號 (信箱) |
AZURE_PASSWORD | 上述帳號的密碼 |
這一情境則是直接設定 Azure 帳號密碼來存取,為了安全性比較不建議使用此方式。
ManagedIdentityCredential
此方式即是前一篇文章介紹的上傳到 App Service 並且開啟身份識別的方式,這無法在開發階段在本機進行設定。

SharedTokenCacheCredential
這個類別的文件和相關討論太少,我無法重現跟實做出來,如果有朋友知道相關的訊息,可以提出來分享討論。
VisualStudioCredential
即是前一篇文章提到的方式,透過在 Virual Studio 的設定,設定一組驗證的帳號。這邊補充說明一個情境,因為預設登入會使用帳號預設的 Tenant ,所以如果 KeyVault 是在另一個 AAD 底下的訂閱,我們用的帳號是該 AAd 的來賓使用者,這時候可能會驗證失敗,出現如下的訊息:

這時候可以設定環境變數 AZURE_TENANT_ID
或是使用 DefaultAzureCredentialOptions
設定 VisualStudioTenantId
來解決這問題。

var options = new DefaultAzureCredentialOptions();
options.VisualStudioTenantId = "{TENANT_ID}";
var secretClient = new SecretClient(new Uri(keyVaultUrl), new DefaultAzureCredential(options));
VisualStudioCodeCredential
安裝 Azure Account 這一套擴充套件,並且執行 Azure: Sign In 指令。


AzureCliCredential
透過命令列執行 Azure Cli az login
指令,如果是在有瀏覽器的系統會自動跳出瀏覽器並且做驗證登入。


如果是沒有瀏覽器的系統,像是 Linux 系列的系統,則可以加上 -use-device-code
參數,然後複製訊息中提示的 Code 來做驗證登入。


InteractiveBrowserCredential
這一個比較特別,預設是沒有啟用的,需要透過設定啟用或是直接指定 InteractiveBrowserCredential 類別,執行的時候他會跳出瀏覽器來做驗證輸入。如果是 Console 程式的話會跳出瀏覽器來做驗證,如果是 Web 程式,則會跳出新分頁來做驗證。
結論
實做上針對 DefaultAzureCredential 微軟提供了很多使用情境,應該可以解決大部分的需求,有時候可能無法使用某情境的方式就可以有許多方式來解決。比較容易遇到的問題應該會是登入的帳號預設會使用帳號預設的 AAD 做驗證,但是服務所在的訂閱並非是該 AAD ,此時針對使用的情境設定正確的 TenantId 就可以解決問題了。