使用服务原则 (.net Core) 向多个 Azure 服务进行身份验证
Authenticate to multiple Azure services using Service Principle (.net Core)
我需要使用 服务原则[=从代码中访问 Key Vault 和 Service 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。
我需要使用 服务原则[=从代码中访问 Key Vault 和 Service 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。