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

Authenticate to multiple Azure services using Service Principle (.net Core)

我需要使用 服务原则[=从代码中访问 Key VaultService Bus 45=] 用于身份验证。

我可以使用以下代码访问服务总线,它按预期工作 - 当我在访问策略[=45=中启用服务原则时] 我可以拉取题目列表:

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 获取一些信息,并且我正在尝试建立一种通用的身份验证方法。

方法一

与上述类似,我尝试使用此代码访问 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: 'Operation returned an invalid status code 'Unauthorized''

方法 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 中都已正确设置)。

感谢任何提示!

当您使用 SdkContext.AzureCredentialsFactory.FromServicePrincipal 进行身份验证时,它将使用 https://management.azure.com/ 作为其资源 URI。

虽然 Azure Key Vault 有自己的授权系统并且其资源 URI 是 https://vault.azure.net,因此您可能会收到 Unauthorized 错误消息。

因此,您可以使用方法 2 通过正确的资源 URI 访问 Azure Key Vault。

更多细节,你可以参考这个article