You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Graph创建OAuth2PermissionGrant:如何获取resourceId

获取ResourceAppId对应的resourceId(服务主体ID)

要解决你从ResourceAppId到resourceId的映射问题,核心逻辑是:resourceId其实是对应资源应用在你的租户中的服务主体(Service Principal)的ObjectId。每个应用注册(包括微软自带的如AAD、Graph)在租户内都会有对应的服务主体,你只需要通过ResourceAppId(也就是应用的Client ID)查询到这个服务主体,就能拿到需要的resourceId。

具体步骤(针对AAD Graph API,匹配你现有的代码)

  1. 查询目标资源的服务主体
    使用AAD Graph的servicePrincipals端点,通过appId筛选找到对应资源的服务主体。比如你需要的Windows Azure Active Directory(ResourceAppId=00000002-0000-0000-c000-000000000000),可以这样查询:

    // 假设你已经有了AAD Graph的client实例
    var servicePrincipalQuery = client.ServicePrincipals
        .Where(sp => sp.AppId == "00000002-0000-0000-c000-000000000000")
        .ExecuteAsync();
    
    var servicePrincipals = await servicePrincipalQuery;
    var targetResourceSp = servicePrincipals.CurrentPage.FirstOrDefault();
    
    if (targetResourceSp == null)
    {
        // 对于微软内置应用(如AAD、Graph),租户内肯定存在对应的服务主体
        // 如果找不到,可能是权限不足或租户异常,需要排查
        throw new InvalidOperationException("Could not find service principal for the target resource app");
    }
    
    // 这里的ObjectId就是你需要的resourceId
    string resourceId = targetResourceSp.ObjectId;
    
  2. 使用resourceId创建权限授予
    把获取到的resourceId代入你原来的代码中,就可以完成权限授予:

    var permissionGrant = new OAuth2PermissionGrant();
    permissionGrant.ClientId = thePrincipal.ObjectId;
    permissionGrant.ConsentType = "AllPrincipals";
    permissionGrant.PrincipalId = null;
    permissionGrant.ResourceId = resourceId; // 替换成上面获取到的ID
    permissionGrant.ExpiryTime = DateTime.Now.AddYears(10);
    permissionGrant.Scope = "User.Read";
    
    await client.Oauth2PermissionGrants.AddOAuth2PermissionGrantAsync(permissionGrant);
    

补充:常见资源的ResourceAppId参考

以下是你提到的几个常见资源的ResourceAppId,方便你直接使用:

  • Windows Azure Active Directory: 00000002-0000-0000-c000-000000000000
  • Microsoft Graph: 00000003-0000-0000-c000-000000000000
  • Office 365 Management API: 00000002-0000-0ff1-ce00-000000000000

注意事项

  • 确保你的应用(用来调用AAD Graph的应用)拥有足够的权限:需要Directory.Read.All或Directory.ReadWrite.All权限(委托或应用权限)来查询服务主体和创建权限授予。
  • 对于多租户应用,如果目标资源应用还没被你的租户同意过,可能需要先触发同意流程来创建服务主体,但微软内置应用不存在这个问题。

内容的提问来源于stack exchange,提问作者Christoph Wille

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:41:55