gpt4 book ai didi

c# - 如何向 Azure C# SecretClient 提供凭据 (DefaultAzureCredential)?它似乎忽略凭据和 RBAC 并抛出 403

转载 作者:行者123 更新时间:2023-12-03 03:44:24 26 4
gpt4 key购买 nike

我有一个带有 key 保管库的 Azure Web 应用程序。我想使用 C# 应用程序将 secret 存储在 key 保管库中。

  • 我有两个订阅:开发订阅和生产订阅。
  • 每个都包含一个 key 保管库。
  • 两个 key 保管库都使用“Azure 基于角色的控制”权限模型。
  • 我的帐户对两个 key 保管库都具有“所有者”和“ key 保管库 secret 官员”角色。
  • 我可以将 secret 从 Azure GUI 或 azure-cli(az keyvault secret 集)上传到这两个环境。

我的 C# 应用程序可以将 secret 上传到开发环境,但不能上传到生产环境,无论我提供什么凭据。在生产中它总是抛出以下错误:

Azure.RequestFailedException: Service request failed.
Status: 403 (Forbidden)

Content:
{"error":{"code":"Forbidden","message":
"Caller is not authorized to perform action on resource.\r\n
If role assignments, deny assignments or role definitions were changed recently, please observe propagation time.\r\n
Caller: appid=<GUID>;oid=<GUID>;iss=https://sts.windows.net/<GUID>/\r\n
Action: 'Microsoft.KeyVault/vaults/secrets/setSecret/action'\r\n
Resource: '<path to my secret>'\r\n
Assignment: (not found)\r\n
Vault: <name>;location=westeurope\r\n",
"innererror":{"code":"ForbiddenByRbac"}}}

错误消息表明它与 RBAC 有关。我不明白它的权利从何而来。我正在从 PowerShell 提示符调用该应用程序。我以为它会从 PowerShell 获取我的权限,但无论我执行 az login 还是 az logoutaz account set 都没有区别。无论我做什么,它都可以很好地上传到开发中,但不能上传到生产中。

我使用Azure.Security.KeyVault.Secrets.SecretClient类。我这样创建它:

private SecretClient CreateSecretClient() =>
new(
new Uri($"https://{_keyVaultName}.vault.azure.net/"),
new DefaultAzureCredential(),
new SecretClientOptions
{
Retry =
{
Delay = TimeSpan.FromSeconds(2),
MaxDelay = TimeSpan.FromSeconds(16),
MaxRetries = 5,
Mode = RetryMode.Exponential
}
});

我这样写 secret :

var keyVaultSecret = new KeyVaultSecret(secretName, value);
await _secretClient.SetSecretAsync(keyVaultSecret, ct);

我还尝试为其提供托管身份(应该有权访问生产而不是开发):

new DefaultAzureCredential(
new DefaultAzureCredentialOptions
{
ManagedIdentityClientId = <GUID>
})

结果还是一样。它愿意写开发,而不是生产。我什至试图给它一个ManagedIdentityClientId,这是无意义的,并且不指向任何现有的托管身份。结果相同。

在我看来,我的 SecretClient 忽略了为其分配的凭据对象和 PowerShell session 中的权限。它是否凭空变出它的权限?无论我做什么,它如何能够写入我的开发环境?我如何让它访问我的其他环境?

最佳答案

我找到了一个有效的修复方法。我可以使用 InteractiveBrowserCredential 而不是 DefaultAzureCredential

    private SecretClient CreateSecretClient() =>
new(
new Uri($"https://{_keyVaultName}.vault.azure.net/"),
new InteractiveBrowserCredential(),
new SecretClientOptions
{
Retry =
{
Delay = TimeSpan.FromSeconds(2),
MaxDelay = TimeSpan.FromSeconds(16),
MaxRetries = 5,
Mode = RetryMode.Exponential
}
});

我也可以使用其他类型的TokenCredential,如下所列:https://learn.microsoft.com/en-us/dotnet/api/azure.identity.defaultazurecredential?view=azure-dotnet

关于c# - 如何向 Azure C# SecretClient 提供凭据 (DefaultAzureCredential)?它似乎忽略凭据和 RBAC 并抛出 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69810410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com