【问题标题】:Grant Admin Consent using Microsoft Graph API - Java使用 Microsoft Graph API 授予管理员同意 - Java
【发布时间】:2021-11-17 13:20:50
【问题描述】:

我使用图形 API 创建了一个应用程序,并为他们分配了权限 - 委托和应用程序...

    ServicePrincipal servicePrincipal = graphClient.servicePrincipals(resSerPrinId)
            .buildRequest()
            .get();
    
    List<AppRole> appRoles = servicePrincipal.appRoles;
    List<PermissionScope> scopes = servicePrincipal.oauth2PermissionScopes;
    
    List<ResourceAccess> raList = new ArrayList<ResourceAccess>();
    
    for (AppRole appRole : appRoles) {
        ResourceAccess access = new ResourceAccess();
        access.id = appRole.id;
        access.type = "Role";
        raList.add(access);
    }
    
    System.out.println("Roles added...");
    
    for (PermissionScope permissionScope : scopes) {
        ResourceAccess access = new ResourceAccess();
        access.id = permissionScope.id;
        access.type = "Scope";
        raList.add(access);
    }
    
    System.out.println("Scopes added...");
    
    RequiredResourceAccess reqResAccess = new RequiredResourceAccess();
    reqResAccess.resourceAccess = raList;
    reqResAccess.resourceAppId = resSerPrinAppClientId;
    
    List<RequiredResourceAccess> rraList = new ArrayList<RequiredResourceAccess>();
    rraList.add(reqResAccess);
    
    Application application = graphClient.applications(clientAppObjId)
            .buildRequest()
            .get();
    
    application.requiredResourceAccess = rraList;
    
    graphClient.applications(clientAppObjId)
    .buildRequest()
    .patch(application);

在上面的代码中,resSerPrinId 是资源服务主体 ID,它在清单中具有应用角色,在“公开 api”部分具有范围...

所以我从该资源服务主体中提取 appRoles 和 oauth2Permission 并将它们发送给客户端服务主体...

在 UI 中,我看到权限没有授予...

是否可以使用某些图形 API 授予他们管理员权限,或者手动加载这些权限,然后授予他们管理员权限...或者我是否需要始终使用 UI 来执行此操作...?

【问题讨论】:

  • 找到了方法...一会儿会和社区分享...
  • 您分享了解决方案吗? :D
  • @MathiasHaugsbø 明天第一件事(6-7 小时后)将分享,今天请假,无法使用我的笔记本电脑:)
  • @MathiasHaugsbø 已添加答案,请通过...在我的国家现在是凌晨 3 点天哪,我需要睡觉 ciao

标签: microsoft-graph-api azure-ad-b2c msgraph


【解决方案1】:

所以我们基本上有两种类型的权限 - 角色(应用程序)/范围(委托)

所以要为您的委派权限提供“授予管理员同意”,请使用以下 sn-p

GraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider( authProvider ).buildClient();

OAuth2PermissionGrant oAuth2PermissionGrant = new OAuth2PermissionGrant();
oAuth2PermissionGrant.clientId = "clientId-value";
oAuth2PermissionGrant.consentType = "consentType-value";
oAuth2PermissionGrant.principalId = "principalId-value";
oAuth2PermissionGrant.resourceId = "resourceId-value";
oAuth2PermissionGrant.scope = "scope-value";

graphClient.oauth2PermissionGrants()
    .buildRequest()
    .post(oAuth2PermissionGrant);

这是文档的链接 - Read about oAuth2PermissionGrant here

现在要为应用程序权限提供“授予管理员同意”,请使用以下 sn-p...

GraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider( authProvider ).buildClient();

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);

这里是文档的链接 - Read more about AppRoleAssignment here

您必须在这里使用这两个坏男孩,然后就完成了 - 只需使用正确的 ID(不要将客户端 ID 与客户端主体 ID 混淆等)

基本上流程是 - 获取所有权限(使用所需资源访问加载两种类型 - 然后使用上述代码为所有权限添加管理员授权。希望这会有所帮助。如果您需要更多帮助,请发表评论。

【讨论】:

  • 谢谢!这正是我昨天要找的。终于找到了。并且供将来参考:应用程序权限依赖于服务原则,这些服务原则与 azureAd 应用程序的 id 不同。因此,对于完全编程的方法,还应该检查是否有任何服务原则连接到这个 azureAd 应用程序: await graphClient.ServicePrincipals .Request() .Filter($"appId eq '{application.AppId}'") .Top(1 ) .GetAsync()。如果不存在则创建一个
  • @MathiasHaugsbø 同样令您惊讶的是,当您使用 SDK 创建应用程序时,它不会创建服务主体,您必须在创建应用程序后创建服务主体。 :)
猜你喜欢
  • 2020-09-28
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多