Azure - 使用服务主体 returns 未经授权的异常对 Key Vault 进行身份验证
Azure - authenticating to KeyVault using Service Principle returns an Unauthorized exception
我正在尝试使用服务原则从 .net Core 控制台应用程序访问 KeyVault(我有 App Id 和 App Secret).这是我的代码:
var client = new KeyVaultClient(GetAccessToken);
var secret = client.GetSecretAsync("https://{keyvaultName}.vault.azure.net", "MySecret").Result;
回调此函数:
private static async Task<string> GetAccessToken(string authority, string resource, string scope)
{
var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
var credential = new ClientCredential(clientId: appId, clientSecret: appSecret);
var authResult = await context.AcquireTokenAsync(resource, credential);
return authResult.AccessToken;
}
调用 GetSecretAsync returns 一个“AccessDenied”异常。修改代码以使用此回调会产生“Unauthorized”异常:
private static async Task<string> GetAccessToken(string authority, string resource, string scope)
{
var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
var credential = new ClientCredential(clientId: appId, clientSecret: appSecret);
**var authResult = await context.AcquireTokenAsync("https://management.core.windows.net/", credential);**
return authResult.AccessToken;
}
我通过转到 Azure > AAD > App Registrations 设置服务原则,在设置原则时记下应用程序 ID 和密码(应用程序机密)。
然后在KeyVault中,我把原理加到Access Control (IAM),有贡献者权限,但还是不开心!
有没有人遇到过这种情况?
谢谢! :)
"Access Control (IAM)" 控制对保管库本身的访问。有一种单独的方法来控制对保险库内容的访问(即:密钥、秘密和证书)。如 these docs 中所述,我们可以授权给定的 AAD 应用程序通过导航到所需的保管库、选择 "Access policies"、单击 "Add new" 来检索 Azure 门户中给定保管库中的机密,然后然后搜索您的服务负责人。您应该能够按应用程序 ID 进行过滤:
我用下面的代码测试它,它在我这边工作正常。 resourceUri 为https://vault.azure.net
.
static string appId = "xxxxxxxxxxxxx";
static string appSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
static string tenantId = "xxxxxxxxxxxxxxxxxxxxx";
public static void Main(string[] args)
{
var kv = new KeyVaultClient(GetAccessToken);
var scret = kv.GetSecretAsync("https://xxxxxx.vault.azure.net", "secretname").GetAwaiter().GetResult();
}
public static async Task<string> GetAccessToken(string azureTenantId, string clientId, string redirectUri)
{
var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
var credential = new ClientCredential(appId, appSecret);
var tokenResult = await context.AcquireTokenAsync("https://vault.azure.net", credential);
return tokenResult.AccessToken;
}
此外,您需要为已注册的应用添加 "Key Vault" 权限。
在 Key Vault 通道中,您需要将策略添加到您注册的应用程序或用户。在访问控制中,您需要为注册的应用程序或用户添加权限。
输出如下:
我正在尝试使用服务原则从 .net Core 控制台应用程序访问 KeyVault(我有 App Id 和 App Secret).这是我的代码:
var client = new KeyVaultClient(GetAccessToken);
var secret = client.GetSecretAsync("https://{keyvaultName}.vault.azure.net", "MySecret").Result;
回调此函数:
private static async Task<string> GetAccessToken(string authority, string resource, string scope)
{
var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
var credential = new ClientCredential(clientId: appId, clientSecret: appSecret);
var authResult = await context.AcquireTokenAsync(resource, credential);
return authResult.AccessToken;
}
调用 GetSecretAsync returns 一个“AccessDenied”异常。修改代码以使用此回调会产生“Unauthorized”异常:
private static async Task<string> GetAccessToken(string authority, string resource, string scope)
{
var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
var credential = new ClientCredential(clientId: appId, clientSecret: appSecret);
**var authResult = await context.AcquireTokenAsync("https://management.core.windows.net/", credential);**
return authResult.AccessToken;
}
我通过转到 Azure > AAD > App Registrations 设置服务原则,在设置原则时记下应用程序 ID 和密码(应用程序机密)。
然后在KeyVault中,我把原理加到Access Control (IAM),有贡献者权限,但还是不开心!
有没有人遇到过这种情况?
谢谢! :)
"Access Control (IAM)" 控制对保管库本身的访问。有一种单独的方法来控制对保险库内容的访问(即:密钥、秘密和证书)。如 these docs 中所述,我们可以授权给定的 AAD 应用程序通过导航到所需的保管库、选择 "Access policies"、单击 "Add new" 来检索 Azure 门户中给定保管库中的机密,然后然后搜索您的服务负责人。您应该能够按应用程序 ID 进行过滤:
我用下面的代码测试它,它在我这边工作正常。 resourceUri 为https://vault.azure.net
.
static string appId = "xxxxxxxxxxxxx";
static string appSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
static string tenantId = "xxxxxxxxxxxxxxxxxxxxx";
public static void Main(string[] args)
{
var kv = new KeyVaultClient(GetAccessToken);
var scret = kv.GetSecretAsync("https://xxxxxx.vault.azure.net", "secretname").GetAwaiter().GetResult();
}
public static async Task<string> GetAccessToken(string azureTenantId, string clientId, string redirectUri)
{
var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
var credential = new ClientCredential(appId, appSecret);
var tokenResult = await context.AcquireTokenAsync("https://vault.azure.net", credential);
return tokenResult.AccessToken;
}
此外,您需要为已注册的应用添加 "Key Vault" 权限。
在 Key Vault 通道中,您需要将策略添加到您注册的应用程序或用户。在访问控制中,您需要为注册的应用程序或用户添加权限。
输出如下: