Azure密钥库-“此密钥库的访问策略未启用操作“列表”以编程方式创建密钥库时

问题描述

我正在使用带有以下Accesspolicies的.net core 2.1和OpenIdConnect创建azure密钥库

 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" }
                        }
                    }
                }

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

enter image description here

注意:- 如上面的代码“授予所有权限”所示。我可以在azure门户中看到它。

我尝试过的方法:- 我试图参考以下已对堆栈溢出的问题进行解答

根据上述堆栈溢出答案“需要传递Azure AD应用程序的服务主体的对象ID而不是Azure AD应用程序的对象ID”。

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

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

它给出以下结果

enter image description here

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

问题:-

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

解决方法

好吧,我可以站在你这边再现你的问题。

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

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

因此,如果您要解决此警告,只需通过门户网站中的Access policies按钮在+ Add Access Policy中添加您的用户帐户,或者您可以在创建密钥库时具有权限的代码。

然后关于您的问题:

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

否,权限就足够了。

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

您不应该使用AD App的对象ID,您可以选择使用object id的对象ID,这取决于您的要求,详细信息here

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

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

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

service principal/security group/user account