问题描述
我正在使用带有以下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}时,它会显示警告 “此密钥库的访问策略中未启用“列表”操作。”
注意:- 如上面的代码“授予所有权限”所示。我可以在azure门户中看到它。
我尝试过的方法:- 我试图参考以下已对堆栈溢出的问题进行解答
- Azure Keyvault - "Operation "list" is not allowed by vault policy" but all permissions are checked
- How do I fix an "Operation 'set' not allowed" error when creating an Azure KeyVault secret programmatically?
根据上述堆栈溢出答案“需要传递Azure AD应用程序的服务主体的对象ID而不是Azure AD应用程序的对象ID”。
我尝试使用以下powershell脚本找出azure AD应用程序服务主体的对象ID
Get-AzADServicePrincipal -ServicePrincipalName "<app client ID>"
它给出以下结果
我试图在AccesspolicyEntry的objectId中使用“ Id”(在上面的屏幕截图中),但是并没有解决问题。
问题:-
- 是否需要在AccesspolicyEntry中设置其他权限?
- AccesspolicyEntry中的objectID应该是什么(当前,我正在提供Azure AD应用程序的obectId)?
- 是否需要服务对象的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