使用服务原理(.net Core)对多个Azure服务进行身份验证

时间:2018-08-29 09:48:10

标签: azure authentication asp.net-core azureservicebus azure-keyvault

我需要使用服务原则进行身份验证,从代码访问 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中正确设置)。

感谢任何提示!

1 个答案:

答案 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