在运行时确定用户分配的托管标识的客户端 ID?

Determine client id of user-assigned managed identity at runtime?

如何确定用户分配给 Azure 上的应用服务或功能 运行 的托管标识的客户端 ID?可以分配多个用户分配的托管标识,我想获得在运行时分配给我的应用程序的列表。

这样做的目的是避免必须在配置中存储托管用户身份的客户端 ID,以用于创建 DefaultAzureCredential 以访问 KeyVault 和其他资源。

现在我的代码如下所示:

string managedIdentityClientId = Environment.GetEnvironmentVariable("ManagedIdentityClientId", EnvironmentVariableTarget.Process);
var options = new DefaultAzureCredentialOptions { ManagedIdentityClientId = managedIdentityClientId };
var keyVaultCredentials = new DefaultAzureCredential(options);

我想避免将 ManagedIdentityClientId 存储在应用程序设置中,并尽可能从配置的应用程序服务中读取它。

没有凭据,无法在运行时获取 user-assigned 托管身份的客户端 ID。

即使您可以使用其他方式,例如在代码中调用 REST API 来获取它们,您还需要使用另一个凭证(例如服务主体),这意味着您还需要在代码中公开客户端 ID 和密码或将它们存储在应用程序设置中, 这没有意义。

因此,对于您的情况,我认为将客户端 ID 存储在应用程序设置中是使用 MSI 的最可行方式。

由于您的 Azure 资源上可以有多个 user-assigned 托管标识,因此无法直接推断应该使用哪个 user-assigned 标识,因此您需要指定它。

对于 system-assigned 托管身份,您不需要指定 clientId,因为每个资源只能有 1 个 system-assigned。

"I'd like to avoid storing the ManagedIdentityClientId in app settings and simply read it from the configured app service if possible."

即使您可以征集分配给资源的所有 user-assigned,您也必须有逻辑才能从列表中选择正确的资源。通过 Config 明确指定 clientId 更容易。