有几个问题。Azure 后端的一些错误,现在已经修复,还有一些我不知道的对 API 的缺失调用是必要的。感谢 MS Support 的一些非常乐于助人的人,我们得以让它工作。
创建应用程序时,您需要执行以下操作:
- 创建应用程序对象。
- 为应用程序设置RequiredResourceAccess,即。应用程序对 Azure Graph API 等具有哪些权限。这是在门户的“对其他应用程序的权限”设置中配置的内容。您可以通过手动配置权限来获取必要的 GUID,然后查看应用程序的 AAD 清单文件。
- 为应用程序创建服务主体。
- 将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 中才有效,然后您可以使用新应用程序进行身份验证。