通过Graph创建OAuth2PermissionGrant:如何获取resourceId
获取ResourceAppId对应的resourceId(服务主体ID)
要解决你从ResourceAppId到resourceId的映射问题,核心逻辑是:resourceId其实是对应资源应用在你的租户中的服务主体(Service Principal)的ObjectId。每个应用注册(包括微软自带的如AAD、Graph)在租户内都会有对应的服务主体,你只需要通过ResourceAppId(也就是应用的Client ID)查询到这个服务主体,就能拿到需要的resourceId。
具体步骤(针对AAD Graph API,匹配你现有的代码)
查询目标资源的服务主体
使用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;使用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
相关产品推荐
相关产品推荐

