【问题标题】:Adding application permission to an client application using MS Graph SDK - Java使用 MS Graph SDK - Java 向客户端应用程序添加应用程序权限
【发布时间】:2021-12-27 08:29:33
【问题描述】:

我已经注册了一个名为“API”的应用程序,为此我在 Manifest 中添加了两个应用程序角色

"appRoles": [
        {
            "allowedMemberTypes": [
                "Application"
            ],
            "description": "Demo Role for application.",
            "displayName": "Demo Role",
            "id": "42ee481e-b4bc-4afa-9499-586bc2a079be",
            "isEnabled": true,
            "lang": null,
            "origin": "Application",
            "value": "demo.role"
        },
        {
            "allowedMemberTypes": [
                "Application"
            ],
            "description": "Test Role for application.",
            "displayName": "Test Role",
            "id": "42ee481e-b4bc-4afa-9499-586bc2a079bd",
            "isEnabled": true,
            "lang": null,
            "origin": "Application",
            "value": "test.role"
        }
    ]

现在我注册了另一个名为“客户端应用程序”的应用程序,我想将此应用程序分配到我在应用程序“API”中定义的两个应用程序角色之上

通过搜索文档,我发现我们将权限分配给应用程序服务主体,而不是应用程序对象。

https://docs.microsoft.com/en-us/graph/api/serviceprincipal-post-approleassignedto?view=graph-rest-1.0&tabs=java

这是我在文档中找到的示例代码...

AppRoleAssignment appRoleAssignment = new AppRoleAssignment();
appRoleAssignment.principalId = UUID.fromString("33ad69f9-da99-4bed-acd0-3f24235cb296");
appRoleAssignment.resourceId = UUID.fromString("9028d19c-26a9-4809-8e3f-20ff73e2d75e");
appRoleAssignment.appRoleId = UUID.fromString("ef7437e6-4f94-4a0a-a110-a439eb2aa8f7");

graphClient.servicePrincipals("9028d19c-26a9-4809-8e3f-20ff73e2d75e").appRoleAssignedTo()
    .buildRequest()
    .post(appRoleAssignment);

principalId:您要为其分配应用角色的用户、组或客户端 servicePrincipal 的 ID。 -- 在哪里可以找到principalId?这是“客户端应用程序”的objectId吗?

resourceId: 已定义应用角色的资源 servicePrincipal 的 id。我在哪里可以找到资源 ID? -- 这是定义了应用角色的“API”应用程序的对象ID吗?

appRoleId: 分配给用户、组或服务主体的 appRole 的 ID(在资源服务主体上定义)。 -- 我找到了应用角色 id - 在“API”应用程序清单中的应用角色中提到的 guid。

请帮忙。

【问题讨论】:

    标签: azure-active-directory microsoft-graph-api azure-ad-b2c


    【解决方案1】:

    当您从门户 UI 创建/注册应用程序时,会自动为您创建一个服务主体,但是当您使用 API 调用创建应用程序时,情况并非如此。

    当您使用 API 注册应用程序时,您必须为该应用程序显式创建服务主体...

    要创建服务主体,您需要一个图形客户端和您创建的应用程序的对象 ID(请注意对象 ID 和应用程序客户端 ID 不同) - 您可以从门户 UI 中查看您的对象 ID。

            Application application = graphClient.applications(objId)
                    .buildRequest()
                    .get();
            
            ServicePrincipal servicePrincipal = new ServicePrincipal();
            servicePrincipal.appId = application.appId;
    
            graphClient.servicePrincipals()
                .buildRequest()
                .post(servicePrincipal);
    

    现在您已经为您的应用程序创建了一个服务主体...接下来是找到您可以这样做的 ID...

            ServicePrincipalCollectionPage servicePrincipals = graphClient.servicePrincipals()
                    .buildRequest()
                    .get();
            
            List<ServicePrincipal> list = servicePrincipals.getCurrentPage();
    

    浏览列表并根据显示名称选择您的应用程序,您也可以找到ID。

    ServicePrincipal.Id --> 这就是你需要的...

    并根据您的需要...

    principalId 是您创建的客户端应用程序 - 因此您需要该应用程序的 servicePrincipal.Id。

    resourceId 是您定义应用程序的应用程序 - 因此您需要该应用程序的 servicePrincipal.Id。

    【讨论】:

    • 这正是我要问的......
    【解决方案2】:

    主体 ID 是 ObjectId,但不是您在门户中看到的实际 ID,而是服务主体的对象 ID,同样,资源 ID 是资源应用的 serviceprincipal 的 objectId。

    查看下面提供的信息的区别:

    门户:resourceApp:

    应用 id:51100c0f-xxxx-xxxx-xxxx-xxxxxxxa59, ObjectId:2275ec6c-xxxx-xxxx-xxxx-xxxxxx2b76e

    来自 powershell 命令:

    $ResourceId= (Get-AzureAdServicePrincipal -Filter "displayName eq 'testapp'").ObjectId
    

    #output :ResourceId: 36929cef-xxxx-xxxx-xxxx-xxxx989dac7

    门户:客户端应用程序:

    应用 id:329cd48e-xxxx-xxxx-xxxx-xxxxxxxx2b88, objectId:9d5e7540-xxxx-xxxx-xxxx-xxxxxxxxx9e1

    $principalId=(Get-AzureAdServicePrincipal -Filter "displayName eq 'client app'").ObjectId
    

    #输出:主体 ID:85a53d22-xxxx-xxxx-xxxx-xxxxx300b2


    在应用角色分配中,resourceId 是资源应用(在您的情况下为 API 应用)的 servicePrincipal 的 ID。要通过 graph api 为资源应用程序和客户端应用程序查找您知道其 appId 的服务主体的 ID:请参阅以下请求

    GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=appId eq '{app-id}'
    

    (或)

    GET https://graph.microsoft.com/v1.0/servicePrincipals/<App id>
     
    

    或者

     GET https://graph.microsoft.com/beta/serviceprincipals?$filter=startswith(displayName, 'Application-Name')
    

    响应将包含 servicePrincipal 对象的 id 属性,您可以在创建应用角色分配时使用它。

    参考: graph/api/serviceprincipal

    【讨论】:

    • 感谢您的解释...很有帮助。
    • 我很高兴它有帮助:) 您可以接受它作为答案(单击答案旁边的复选标记将其从灰色切换为已填充)。这对其他社区成员可能是有益的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2019-08-01
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多