我尝试使用AAD令牌启用服务来验证身份验证。我的计划是验证"群组"在令牌中声明确保调用者是我们创建的安全组的成员。
例如,我们将为读者创建group1,为编写者创建group2。然后基于"群组"声明,我将找出正确的访问级别。
我使用AAD应用程序发出令牌(而非用户),因此我需要该应用程序成为安全组的成员。 Azure AD powershell似乎不接受应用程序ID作为组成员。怎么解决这个?当调用者是另一个AAD应用程序时,还有其他推荐的模式吗?
使用的命令: https://docs.microsoft.com/en-us/powershell/module/azuread/Add-AzureADGroupMember?view=azureadps-2.0
Error:
Add-AzureADGroupMember : Error occurred while executing AddGroupMember
Code: Request_BadRequest
Message: An invalid operation was included in the following modified references: 'members'.
RequestId: 0441a156-3a34-484b-83d7-a7863d14654e
DateTimeStamp: Mon, 11 Dec 2017 21:50:41 GMT
HttpStatusCode: BadRequest
HttpStatusDescription: Bad Request
HttpResponseStatus: Completed
At line:1 char:1
+ Add-AzureADGroupMember -ObjectId "9c2cdf89-b8d6-4fb9-9116-7749adec85c ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Add-AzureADGroupMember], ApiException
+ FullyQualifiedErrorId : Microsoft.Open.AzureAD16.Client.ApiException,Microsoft.Open.AzureAD16.PowerShell.AddGroupMember
答案 0 :(得分:14)
Add-AzureADGroupMember
的官方文档未明确表示您无法使用应用程序的ObjectId
作为RefObjectId
,但绝对不能使用它。
您既不能将应用程序添加为Azure AD组的成员。
例如,我们将为读者创建group1,为编写者创建group2。 然后基于“群组”声明,我将找出正确的访问权限 水平。
目前,您可以向AAD组添加服务主体:
示例:强>
$spn = Get-AzureADServicePrincipal -SearchString "yourSpName"
$group = Get-AzureADGroup -SearchString "yourGroupName"
Add-AzureADGroupMember -ObjectId $($group.ObjectId) -RefObjectId $($spn.ObjectId)
最近,我还看到许多用户希望将角色分配给服务主体,以使服务主体具有访问具有角色的应用程序的一些权限。
我想在这里说清楚。基于角色的授权应该用于用户,而不是应用程序。它不是为应用程序设计的。如果您想提供一些不同的权限,您可以考虑为您的服务主体分配应用程序权限。
您可以通过编辑应用注册中的清单来公开具有应用权限的Web App / API。
您可以转到Azure门户> Azure Active Directory>应用注册>选择你的应用>清单。
在appRoles
中,您可以插入如下内容:
{
"allowedMemberTypes": [
"Application"
],
"displayName": "Access to the settings data",
"id": "c20e145e-5459-4a6c-a074-b942bbd4cfe1",
"isEnabled": true,
"description": "Administrators can access to the settings data in their tenant",
"value": "Settingsdata.ReadWrite.All"
},
然后,您可以进入另一个您想要授权的应用注册>设置>需要权限>添加>搜索您要访问的应用程序名称>选择您之前创建的应用程序权限。
因此,您的sp可以在令牌声明中获得具有该应用程序权限的令牌。
此外,对于资源授权,您需要添加代码逻辑,以便为Settingsdata.ReadWrite.All
声明的令牌提供控制策略。