0

我使用 AAD Graph API 在 Azure AD 中创建了一个新应用程序。(代码

不幸的是,在我访问 Azure 管理门户中的应用程序配置页面并进行外观更改并保存之前,它不会让我的客户访问请求的资源。删除更改并再次保存后,它仍然有效。更改 + 回退步骤之前和之后的应用程序清单文件完全相同(如 diff.exe 中所说的它们是相同的)。

在比较应用程序验证时返回的 JWT 令牌时,它表明更改后访问令牌包含“角色”部分。将应用程序保存在管理门户中之前返回的访问令牌中不存在整个“角色”部分。

因此,在保存更改时,Azure 管理门户似乎对应用程序做了“某些事情”。问题是它是什么,我可以使用 AAD 图形 API 做同样的事情吗?

4

2 回答 2

1

有几个问题。Azure 后端的一些错误,现在已经修复,还有一些我不知道的对 API 的缺失调用是必要的。感谢 MS Support 的一些非常乐于助人的人,我们得以让它工作。

创建应用程序时,您需要执行以下操作:

  1. 创建应用程序对象。
  2. 为应用程序设置RequiredResourceAccess,即。应用程序对 Azure Graph API 等具有哪些权限。这是在门户的“对其他应用程序的权限”设置中配置的内容。您可以通过手动配置权限来获取必要的 GUID,然后查看应用程序的 AAD 清单文件。
  3. 为应用程序创建服务主体
  4. AppRoleAssignments添加到服务主体。

最后一部分是我之前缺少的。即使您已在应用程序对象上配置了 RequiredResourceAccess,服务主体仍需要 AppRoleAssignments 才能实际拥有访问资源的权限。

创建 AppRoleAssignments 时,要确定要分配哪个 PrincipalId 有点棘手,因为那是其他资源的服务主体的 AAD ObjectId。

下面是添加 AppRoleAssignment 以访问 Azure AD Graph API 的片段。client是一个ActiveDirectoryClient实例,并且sp是我的应用程序的 ServicePrincipal:

// find the azure ad service principal
var aadsp =
     client.ServicePrincipals.Where(csp => csp.AppId == "00000002-0000-0000-c000-000000000000")
     .ExecuteSingleAsync().Result;

// create the app role assignment
var azureDirectoryReadAssignment = new AppRoleAssignment
{
    PrincipalType = "ServicePrincipal",
    PrincipalId = Guid.Parse(sp.ObjectId), //
    Id = Guid.Parse("5778995a-e1bf-45b8-affa-663a9f3f4d04"), // id for Directory.Read
    // azure active directory resource ID
    ResourceId = Guid.Parse(aadsp.ObjectId) // azure active directory resource ID
};
// add it to the service principal
sp.AppRoleAssignments.Add(azureDirectoryReadAssignment);
// update the service principal in AAD
await sp.UpdateAsync();

我的经验是,您需要等待一小段时间,可能是 2-3 分钟,新创建的对象在 AAD 中才有效,然后您可以使用新应用程序进行身份验证。

于 2016-06-06T08:38:16.913 回答
0

除了上面 RasmusW 的回答之外,您可能还需要做一些事情,具体取决于您要实现的目标。

  1. 如果您希望委派权限起作用,您还需要在根级别将 Oauth2PermissionGrant 添加到 Oauth2PermissionGrants 集合中。这应该有调用者的 SPN ObjectId 的 clientId,被调用的 SPN 的对象 Id 的 ResourceId。Oauth2PermissionGrant 的 Scope 值是关键。它应该有空格分隔的值。此处的每个值都来自目标 SPN 上 Oauth2Permission 对象的“值”属性。
  2. 此外,您可能还需要处于适当的 DirectoryRole 中,例如 Directory Readers。
于 2016-06-30T16:02:31.747 回答