App Service 實做身份識別存取 KeyVault (二)

  • 655
  • 0

針對前一篇文章,針對 DefaultAzureCredential 做深入一點的探討,並且解決實做上可能遇到的情境的解決方式。

前言

針對前一篇文章,針對 DefaultAzureCredential 做深入一點的探討,並且解決實做上可能遇到的情境的解決方式。

說明

根據官方文件說明 DefaultAzureCredential 會按照如下圖順序使用對應的類別來做身份的識別,前一篇就是使用 Visual Studio (VisualStudioCredential) 裡面的設定來做身份的識別。

而 Credential 也包含了底下實做,如果想要直接指定特定的方式就可以直接使用底下類別,或是透過 DefaultAzureCredentialOptions 設定要使用的方式。

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_IDAAD 內的應用程式 ID
AZURE_TENANT_IDAAD 所在的 Tenant ID
AZURE_CLIENT_SECRETAAD 內的應用程式 Serect

此為在 AAD 底下設定一組應用程式和金鑰,並且設定此組應用程式到 KeyVault 的存取原則內。

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

產生和取得秘密 (Secret)

設定到存取原則內

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

Service principal with certificate (服務主體和證書)

變數名稱說明
AZURE_CLIENT_IDAAD 內的應用程式 ID
AZURE_TENANT_IDAAD 所在的 Tenant ID
AZURE_CLIENT_CERTIFICATE_PATH包含私鑰且使用 PEM 編碼方式的憑證路徑(無密碼保護)

這一項目和上一項差別僅在產生秘密那邊改上傳憑證檔案,設定上則是設定憑證路徑。

Username and password (使用者帳號和密碼)

變數名稱說明
AZURE_CLIENT_IDAAD 內的應用程式 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 就可以解決問題了。

參考資料