azure 将AAD应用程序添加为安全组的成员

q8l4jmvw  于 2023-08-07  发布在  其他
关注(0)|答案(3)|浏览(123)

我正在尝试使用AAD令牌启用服务到服务身份验证。我的计划是验证令牌中的“groups”声明,以确保调用方是我们创建的安全组的成员。
例如,我们将为读取器创建group1,为写入器创建group2。然后根据“组”的说法,我将计算出正确的访问级别。
我使用AAD应用程序来颁发令牌(不是用户),因此我需要该应用程序成为安全组的成员。Azure AD powershell似乎不接受应用程序ID作为组成员。这个怎么解决?当呼叫者是另一个AAD应用程序时,是否有其他推荐模式?
使用的命令:https://learn.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

字符串

83qze16e

83qze16e1#

1.很遗憾,您无法将应用程序添加为Azure AD组的成员。虽然PowerShell cmdlet Add-AzureADGroupMember的官方文档没有明确说明不能将Application的ObjectId用作RefObjectId,但绝对不能使用它。也不能将应用程序添加为Azure AD组的成员。
例如,我们将为读取器创建group 1,为写入器创建group 2。然后根据“组”的说法,我将计算出正确的访问级别。
1.对于你的情况,恐怕你现在无法实现这一点。我理解您为什么需要这个。根据您的要求,我的想法是将您的应用从企业应用程序分配给具有不同访问权限的组或用户和管理器用户。但是,您不能为选定组选择更多角色。只有一个角色是默认访问如果想为应用定义更多角色,可以参考this documentation。我还尝试使用Azure AD RBAC并为我的测试应用创建新的条件访问,但所有这些都没有只读这个选项。你也可以把你的想法放在Azure Feedback Forum中,azure团队会看到的。我会支持你的想法。

更新:

当前,您可以向AAD组添加服务主体:

范例:

$spn = Get-AzureADServicePrincipal -SearchString "yourSpName"

$group = Get-AzureADGroup -SearchString "yourGroupName"

Add-AzureADGroupMember -ObjectId $($group.ObjectId) -RefObjectId $($spn.ObjectId)

字符串

更新2:

最近,我还看到很多用户希望为服务主体分配角色,让服务主体拥有访问具有角色的应用的权限。
我想在这里澄清。基于角色的授权应该用于用户,而不是应用程序。它不是为应用而设计的。如果您想给予一些不同的权限,可以考虑将应用程序权限分配给服务主体。
您可以通过编辑应用程序注册中的清单来公开具有应用程序权限的Web应用程序/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声明的令牌给予控制策略。

更新3

目前,您可以直接在Azure门户中将服务主体添加到一个AAD组:x1c 0d1x的数据

yyyllmsg

yyyllmsg2#

在@韦恩Yang回答中的更新3之后,我已经成功地使用C#和MS Graph SDK实现了这个功能。但我认为使用PowerShell和简单的REST API调用也是可能的。

// create new application registration
var app = new Application
{
    DisplayName = principal.DisplayName,
    Description = principal.Description,
};

app = await _graphClient.Applications.Request().AddAsync(app);

// create new service Principal based on newly created application
var servicePrincipal = new ServicePrincipal
{
    AppId = app.AppId
};

// add service principal 
servicePrincipal = await _graphClient.ServicePrincipals.Request().AddAsync(servicePrincipal);
// add service principal to existing security group
await _graphClient.Groups[groupId].Members.References.Request().AddAsync(servicePrincipal);

字符串

pdkcd3nj

pdkcd3nj3#

如果你有一个应用程序需要管理它拥有的Azure安全组的应用程序服务主体(或用户)的成员资格,而不需要任何额外的Graph API权限来查询该租户中的用户/服务主体(这发生在跨多个团队/用户共享公共租户的企业中),那么以下代码应该可以工作。这使用 “Microsoft.Graph” 库版本5.XX

public async Task AddServicePrincipalToGroupAsync(string tenantId, string spObjectId, string groupId)
{
    var graphServiceClient = await FetchClientAsync(tenantId);

    if (!await IsMemberServicePrincipalInGroupAsync(tenantId, spObjectId, groupId))
    {
       var requestBody = new ReferenceCreate
       {
           OdataId = $"https://graph.microsoft.com/v1.0/directoryObjects/{spObjectId}",
    };
    await graphServiceClient.Groups[groupId]
        .Members.Ref.PostAsync(requestBody);
}

public async Task RemoveServicePrincipalFromGroupAsync(string tenantId, string spObjectId, string groupId)
    {
        var graphServiceClient = await FetchClientAsync(tenantId);

        if (!await IsMemberInGroupAsync(tenantId, spObjectId, groupId))
        {
            // LOG: Member not present in group. No action needed
            return;
        }

        await graphServiceClient.Groups[groupId]
               .Members[spObjectId].Ref.DeleteAsync();
    }

 public async Task<bool> IsMemberServicePrincipalInGroupAsync(string tenantId, string spObjectId, string groupId)
{
    var graphServiceClient = await FetchClientAsync(tenantId);
    var groupSps = await graphServiceClient.Groups[groupId]
        .Members.GraphServicePrincipal.GetAsync();

    return groupSps.Value.Any(x => x.Id == spObjectId);
}

字符串

相关问题