我需要使用服务原则进行身份验证,从代码访问 Key Vault 和 Service Bus 。
我可以使用以下代码访问服务总线,该总线可以按预期方式工作-当在访问策略中启用服务原则时,我可以拉出主题列表:
var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(APPID, APPSECRET, TENANTID, AzureEnvironment.AzureGlobalCloud);
var serviceBusManager = ServiceBusManager.Authenticate(credentials, SUBSCRIPTIONID);
var serviceBusNamespace = serviceBusManager.Namespaces.List().SingleOrDefault(n => n.Name == "SERVICEBUSNAMESPACE");
var topics = serviceBusNamespace.Topics.ListAsync().GetAwaiter().GetResult();
但是,我还需要从Key Vault中获取一些信息,并且我试图建立一种通用的身份验证方法。
方法1
与上述类似,我尝试使用以下代码访问KeyVault:
var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(APPID, APPSECRET, TENANTID, AzureEnvironment.AzureGlobalCloud);
var kvManager = new KeyVaultClient(credentials);
var secret = kvManager.GetSecretAsync("https://VAULTNAMESPACE.vault.azure.net", "SECRETNAME").GetAwaiter().GetResult().Value;
我收到以下错误:
Microsoft.Azure.KeyVault.Models.KeyVaultErrorException:'操作 返回了无效的状态码“未经授权”
方法2
此代码确实适用于Key Vault(显示我具有正确的权限):
string GetSecret()
{
var client = new KeyVaultClient(GetAccessToken);
var secret = client.GetSecretAsync("https://VAULTNAMESPACE.vault.azure.net", "SECRETNAME").GetAwaiter().GetResult();
return secret;
}
private static async Task<string> GetAccessToken(string authority, string resource, string scope)
{
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;
}
但是,这又是KeyVault特定的身份验证方式,我希望使用 SdkContext.AzureCredentialsFactory 建立通用机制。有什么原因会导致我收到上面的代码连接到Key Vault的 Unauthorized 异常? (所有设置均已在Azure中正确设置)。
感谢任何提示!
答案 0 :(得分:1)
使用package_c.config_option_1
进行身份验证时,它将使用SdkContext.AzureCredentialsFactory.FromServicePrincipal
作为其资源Uri。
虽然Azure Key Vault具有自己的授权系统,并且其资源Uri为https://management.azure.com/
,所以您可能会收到https://vault.azure.net
错误消息。
因此,您可以使用Method2来使用正确的Resource Uri访问Azure Key Vault。
有关更多详细信息,您可以参考此article。