【问题标题】:Use a certificate in the keyvault to access multi-tenant application in other tenant使用 keyvault 中的证书访问其他租户中的多租户应用程序
【发布时间】:2020-06-17 11:09:08
【问题描述】:

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

我们希望从本地存储中删除证书,并使用密钥保管库中的证书为外部租户之一请求令牌。根据documentation,这是用例之一。

我们的租户(id:xxxx):

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

其他租户(id:yyyy):

问题一:

如何在连接到现有应用程序(应用程序 ID:abcd-xxx-xxxx-xxx)的 Key Vault 中创建证书?请务必注意,由于该应用程序已被多个第三方管理员批准,因此无法重新创建。在过期后创建新证书的计数相同。

问题2:

如何将Microsoft.Azure.Services.AppAuthentication 库设置为:

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

【问题讨论】:

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


    【解决方案1】:

    答案 1:

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

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

    答案 2:

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

    无需更改代码,当您在启用了托管标识的 Azure 应用服务或 Azure VM 上运行代码时,库会自动使用托管标识,请参阅link

    环境变量AzureServicesAuthConnectionString 必须设置为可以访问密钥库的任何credentialRunAs=Developer; DeveloperTool=AzureCli 用于开发或RunAs=App; 用于托管服务标识(自动在 azure 中)。

    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);
    

    【讨论】:

    • 微星也使用环境变量对RunAs=App?那么,如果环境变量设置为TenantID:tenant2,那么第二个令牌提供者如何访问租户 1 中的密钥库。
    • 答案1:很好,应该在documentation
    • @Stephan 从文档的描述中,我们可能只需要使用azureServiceTokenProvider2 而不使用azureServiceTokenProvider1 ,当在AzureServicesAuthConnectionString 中指定KeyVaultCertificateSecretIdentifier 时,看起来它会得到自动证书,然后将其与服务主体一起使用。
    • 您有找到该文档的链接吗?这听起来对我们来说是一个非常好的解决方案。
    • @Stephan 没有关于多租户场景的文档,我只是查看了这个link,看起来很相似,但我不是 100% 确定它会起作用,你可以有先试一试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多