使用密钥库中的证书访问其他租户中的多租户应用程序

时间:2020-03-04 21:17:33

标签: azure azure-active-directory azure-keyvault

我们的Azure AD租户中有一个多租户应用程序。它在其他一些租户(我们知道哪些租户)中得到授权。并且它已注册了多个证书以用作客户端凭据。

我们想从本地存储中删除证书,并使用密钥库中的证书来请求外部租户之一的令牌。根据{{​​3}},这是用例之一。

我们的房客(id:xxxx):

  • 已进行应用注册(应用ID:abcd-xxx-xxxx-xxx)
  • 具有密钥库
  • 具有托管服务主体(可以访问密钥库)

其他房客(id:yyyy):

问题1:

如何在连接到现有应用程序(应用程序标识:abcd-xxx-xxxx-xxx)的密钥库中创建证书?重要的是要注意,由于该应用程序已被数位第三方管理员批准,因此无法重新创建。过期后,用于创建新证书的计数相同。

问题2:

如何将Admin consent库设置为:

  1. 使用托管身份访问租户(xxxx)中的密钥库。
  2. 使用密钥库中的证书为其他公司租户(yyyy)中的我们的应用(abcd-xxx-xxxx-xxx)请求令牌

1 个答案:

答案 0 :(得分:1)

答案1:

您可以使用az ad sp credential reset命令,如下所示。如果您不想覆盖应用程序的现有证书,请传递--append参数。

az ad sp credential reset --name '<application-id>' --keyvault joykeyvault --cert cer136 --create-cert --append

enter image description here

enter image description here

enter image description here

答案2:

1。要使用MSI访问租户中的密钥库,只需使用以下代码即可。

不需要更改代码,当您在启用了托管身份的Azure App Service或Azure VM上运行代码时,库将自动使用托管身份,请参阅此link

必须将环境变量AzureServicesAuthConnectionString设置为任何具有密钥库访问权限的credentialRunAs=Developer; DeveloperTool=AzureCli用于开发人员,RunAs=App;用于管理服务身份(自动以天蓝色)。

using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.KeyVault;

// Instantiate a new KeyVaultClient object, with an access token to Key Vault
var azureServiceTokenProvider1 = new AzureServiceTokenProvider();
var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider1.KeyVaultTokenCallback));

2。如果要使用服务主体及其存储在密钥仓库中的证书来获取另一租户中资源的令牌,则必须将AzureServiceTokenProvider上的连接字符串设置为RunAs=App;AppId={TestAppId};KeyVaultCertificateSecretIdentifier={KeyVaultCertificateSecretIdentifier},然后可以为其他租户获得令牌。

const string appWithCertConnection = "RunAs=App;AppId={TestAppId};KeyVaultCertificateSecretIdentifier=https://myKeyVault.vault.azure.net/secrets/myCert";

然后使用代码获取令牌,例如资源https://management.azure.com/

var azureServiceTokenProvider2 = new AzureServiceTokenProvider(appWithCertConnection);
string accessToken = await azureServiceTokenProvider2.GetAccessTokenAsync("https://management.azure.com/", "tenant-id-of-thridh-party-tenant").ConfigureAwait(false);