如何向用户分配的标识授予对密钥保管库的访问权限?
How can I give access to key vault to a user assigned identity?
是否可以向用户分配的身份授予对密钥保管库的访问权限?
在 Azure 门户的托管身份中,我创建了一个新身份 "KeyVaultIdentity",并将其分配给 Web 应用程序(在身份中,用户分配的身份选项卡)。在 Key Vault 的访问策略中,我添加了新创建的 "KeyVaultIdentity" 身份并提供了访问机密的权限。
我正在使用以下代码访问密钥库:
try
{
/* The below 4 lines of code shows you how to use AppAuthentication library to fetch secrets from your Key Vault*/
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var secret = await keyVaultClient.GetSecretAsync("https://play9VaultDemo.vault.azure.net/secrets/AppSecret")
.ConfigureAwait(false);
Message = secret.Value;
/* The below do while logic is to handle throttling errors thrown by Azure Key Vault. It shows how to do exponential backoff which is the recommended client side throttling*/
do
{
long waitTime = Math.Min(getWaitTime(retries), 2000000);
secret = await keyVaultClient.GetSecretAsync("https://play9VaultDemo.vault.azure.net/secrets/AppSecret")
.ConfigureAwait(false);
retry = false;
}
while (retry && (retries++ < 10));
}
/// <exception cref="KeyVaultErrorException">
/// Thrown when the operation returned an invalid status code
/// </exception>
catch (KeyVaultErrorException keyVaultException)
{
Message = keyVaultException.Message;
if ((int)keyVaultException.Response.StatusCode == 429)
retry = true;
}
但是当我试图访问秘密时它说访问被禁止。但是,如果在 Key Vault 中我授予对 Web 应用程序的系统分配标识的访问权限,我就可以访问秘密,
您知道如何使用用户分配的身份进行这项工作吗?
Do you have any idea how can I make this work with the user assigned identity?
您可以按照 How to use managed identities for App Service and Azure Functions 中的步骤进行操作。
步骤如下:
1.In webapp Identity
,单击 User Assigned(preview)
并添加您的用户分配的托管标识。
2.Adding 用户分配的类型和 cotells Azure 使用 Azure 资源管理器模板为您的应用程序创建和管理标识。
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]": {}
}
}
3.If 您向 Key Vault 请求令牌,您需要确保您已添加包含应用程序身份的访问策略。否则,您对 Key Vault 的调用将被拒绝,即使它们包含令牌也是如此。
4.Using Microsoft.Azure.Services.AppAuthentication
用于 .NET 的库获得机密。
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var secret = keyVaultClient.GetSecretAsync("https://yourkeyvaultname.vault.azure.net/secrets/secretname").Result.Value;
5.The输出如下:
我遇到了同样的问题,每次我尝试使用用户分配的身份访问 KeyVault 时,我都必须做两件事才能获得 "forbidden":
将我使用的 Microsoft.Azure.Services.AppAuthentication 版本升级到 1.2.0-preview2。早期版本不支持用户分配的身份。
将连接字符串传递到 AzureServiceTokenProvider 构造函数以告知服务使用哪个标识。这是上面所有链接都忽略的一点。所以我有:
var connectionString = "RunAs=App;AppId=";
var azureServiceTokenProvider = new AzureServiceTokenProvider(connectionString);
而不是:
var azureServiceTokenProvider = new AzureServiceTokenProvider();
要查找您的 clientId 的值,请在 Azure 门户中打开您的托管标识。您应该会看到一个标记为 "Client ID" 的字段。这就是你想要的。
如果您 运行 遇到此错误 Connection string is not valid. Must contain 'TenantId'
那么请确保您明确引用 Microsoft.Azure.Services.AppAuthentication >= v1.2.0
我使用的是 Microsoft.Extensions.Configuration.AzureKeyVault v3.1.3
,它附带较低版本的 AppAuthentication
,因此用户分配的身份不起作用。
更多信息在这里:
https://github.com/MicrosoftDocs/azure-docs/issues/28729
是否可以向用户分配的身份授予对密钥保管库的访问权限?
在 Azure 门户的托管身份中,我创建了一个新身份 "KeyVaultIdentity",并将其分配给 Web 应用程序(在身份中,用户分配的身份选项卡)。在 Key Vault 的访问策略中,我添加了新创建的 "KeyVaultIdentity" 身份并提供了访问机密的权限。
我正在使用以下代码访问密钥库:
try
{
/* The below 4 lines of code shows you how to use AppAuthentication library to fetch secrets from your Key Vault*/
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var secret = await keyVaultClient.GetSecretAsync("https://play9VaultDemo.vault.azure.net/secrets/AppSecret")
.ConfigureAwait(false);
Message = secret.Value;
/* The below do while logic is to handle throttling errors thrown by Azure Key Vault. It shows how to do exponential backoff which is the recommended client side throttling*/
do
{
long waitTime = Math.Min(getWaitTime(retries), 2000000);
secret = await keyVaultClient.GetSecretAsync("https://play9VaultDemo.vault.azure.net/secrets/AppSecret")
.ConfigureAwait(false);
retry = false;
}
while (retry && (retries++ < 10));
}
/// <exception cref="KeyVaultErrorException">
/// Thrown when the operation returned an invalid status code
/// </exception>
catch (KeyVaultErrorException keyVaultException)
{
Message = keyVaultException.Message;
if ((int)keyVaultException.Response.StatusCode == 429)
retry = true;
}
但是当我试图访问秘密时它说访问被禁止。但是,如果在 Key Vault 中我授予对 Web 应用程序的系统分配标识的访问权限,我就可以访问秘密,
您知道如何使用用户分配的身份进行这项工作吗?
Do you have any idea how can I make this work with the user assigned identity?
您可以按照 How to use managed identities for App Service and Azure Functions 中的步骤进行操作。
步骤如下:
1.In webapp Identity
,单击 User Assigned(preview)
并添加您的用户分配的托管标识。
2.Adding 用户分配的类型和 cotells Azure 使用 Azure 资源管理器模板为您的应用程序创建和管理标识。
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]": {}
}
}
3.If 您向 Key Vault 请求令牌,您需要确保您已添加包含应用程序身份的访问策略。否则,您对 Key Vault 的调用将被拒绝,即使它们包含令牌也是如此。
4.Using Microsoft.Azure.Services.AppAuthentication
用于 .NET 的库获得机密。
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var secret = keyVaultClient.GetSecretAsync("https://yourkeyvaultname.vault.azure.net/secrets/secretname").Result.Value;
5.The输出如下:
我遇到了同样的问题,每次我尝试使用用户分配的身份访问 KeyVault 时,我都必须做两件事才能获得 "forbidden":
将我使用的 Microsoft.Azure.Services.AppAuthentication 版本升级到 1.2.0-preview2。早期版本不支持用户分配的身份。
将连接字符串传递到 AzureServiceTokenProvider 构造函数以告知服务使用哪个标识。这是上面所有链接都忽略的一点。所以我有:
var connectionString = "RunAs=App;AppId=";
var azureServiceTokenProvider = new AzureServiceTokenProvider(connectionString);
而不是:
var azureServiceTokenProvider = new AzureServiceTokenProvider();
要查找您的 clientId 的值,请在 Azure 门户中打开您的托管标识。您应该会看到一个标记为 "Client ID" 的字段。这就是你想要的。
如果您 运行 遇到此错误 Connection string is not valid. Must contain 'TenantId'
那么请确保您明确引用 Microsoft.Azure.Services.AppAuthentication >= v1.2.0
我使用的是 Microsoft.Extensions.Configuration.AzureKeyVault v3.1.3
,它附带较低版本的 AppAuthentication
,因此用户分配的身份不起作用。
更多信息在这里: https://github.com/MicrosoftDocs/azure-docs/issues/28729