我正在尝试使用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
Add-AzureADGroupMember
的官方文档没有说清楚你不能使用Application的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)
最近,我还看到许多用户希望将角色分配给服务主体,以使服务主体具有访问具有角色的应用程序的一些权限。
我想在这里说清楚。基于角色的授权应该用于用户,而不是应用程序。它不是为应用程序设计的。如果要提供某些不同的权限,可以考虑将应用程序权限分配给服务主体。
您可以通过编辑应用程序注册中的Manifest来向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
声明为该令牌提供控制策略。