【问题标题】:Azure Keyvault - "The operation "List" is not enabled in this key vault's access policy." while creating keyvault programmaticallyAzure Keyvault - “此密钥保管库的访问策略中未启用“列表”操作。”在以编程方式创建密钥库时
【发布时间】:2020-12-08 20:00:14
【问题描述】:

我正在使用带有 OpenIdConnect 的 .net core 2.1 和以下 AccessPolicies 创建 azure keyvault

 AccessPolicies = new List<AccessPolicyEntry>()
                {
                    new AccessPolicyEntry
                    {
                        TenantId = Guid.Parse(tenantId),
                        ObjectId = objectId,
                        Permissions = new Permissions
                        {
                          Secrets = new List<string> { "all" },
                          Keys = new string[] { "all" },
                          Certificates = new string[]{"all" }
                        }
                    }
                }

现在,我可以使用它来创建 keyvault,但是在转到新创建的 keyvault(在 Azure 门户中)设置刀片 {Key,Secrete,Certificate} 时,它会显示警告 “此密钥保管库的访问策略中未启用“列表”操作。”

注意:- 如上代码“All permission are given”。我可以在azure portal看到。

我尝试过的:- 我已经尝试参考以下堆栈溢出问题的答案

根据上面的stackoverflow答案“需要传递Azure AD应用程序的服务主体的对象ID,而不是Azure AD应用程序的对象ID”。

我尝试使用以下 powershell 脚本找出 azure AD 应用程序的服务主体的对象 ID

Get-AzADServicePrincipal -ServicePrincipalName "<app client ID>"

结果如下

我尝试在 AccessPolicyEntry 的 objectId 中使用“Id”(在上面的屏幕截图中),但没有解决问题。

问题:-

  1. 是否需要在 AccessPolicyEntry 中设置其他权限?
  2. AccessPolicyEntry 中的 objectID 应该是什么(目前,我正在提供 Azure AD 应用程序的 obectId)?
  3. 如果需要服务主体的 objectId。如何以编程方式获取它?

【问题讨论】:

    标签: azure azure-keyvault


    【解决方案1】:

    好吧,我可以在我这边重现您的问题。

    首先,pass the object ID of the service principal instead of object ID of your Azure AD application 的操作是完全正确的。将所有权限授予Access policies 中的服务主体后,服务主体将拥有权限。

    但是当您检查门户中的密钥库时,您使用的是登录 azure 门户而不是服务主体的用户帐户,这会导致警告。

    因此,如果您想修复警告,只需在门户中通过+ Add Access Policy 按钮将您的用户帐户添加到Access policies 中,或者您可以在代码中指定您的用户帐户的object id 并具有以下权限创建密钥库。

    那么关于你的问题:

    是否需要在 AccessPolicyEntry 中设置其他权限?

    没有,权限就够了。

    AccessPolicyEntry 中的 objectID 应该是什么(目前,我正在提供 Azure AD 应用程序的 obectId)?

    你不应该使用AD App的object id,你的选择是使用service principal/security group/user account的object id,这取决于你的要求,详情here

    如果需要服务主体的 objectId。如何以编程方式获取它?

    您可以使用之前使用的 powershell 命令,或通过服务主体名称使用 Azure CLI az ad sp show

    或者,如果您可以使用 Microsoft Graph SDK for C#filter,类似:

    GraphServiceClient graphClient = new GraphServiceClient( authProvider );
    
    var serviceprincipals = await graphClient.Serviceprincipals
        .Request().
        .Filter("some condition").
        .GetAsync();
    

    【讨论】:

    • 谢谢!对于这个详细的解释。现在我已经使用 powershell 获取用户的 objectId。但我想获取登录用户的 objectId。如何使用 Microsoft Graph SDK 获取当前登录用户的 objectId?(如您在上面的答案中显示的 serviceprincipals)
    • @HarishShisode 您好,我认为这与原帖的主题确实是一个不同的问题,您可能需要在新帖子中问它,包括您的场景,然后它也会清楚其他人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    相关资源
    最近更新 更多