列出 Azure AD 组所需的权限

Permissions required to list Azure AD Groups

我正在尝试使用 NodeJs 访问 Azure AD 的一些细节。我可以获得访问令牌 OK,但是每当我尝试使用图形 API 调用任何东西(在本例中只是所有组的列表)时,它说我有 "Insufficient privileges to complete the operation."

我已经进入 AD 中的应用程序并添加了所有权限(只是为了确保),但我仍然收到此错误 - 我是否遗漏了什么?这是我的代码:

var msRestAzure = require('ms-rest-azure');
var graphRbacManagementClient = require('azure-graph');
var tenantId='';
// Enter your tenant ID here which can be found from your Azure AD URL
// Eg. https://manage.windowsazure.com/example.com#Workspaces/ActiveDirectoryExtension/Directory/<TenantId>/users

var clientId = ''
var clientSecret = ''

console.log('Starting');

msRestAzure.loginWithServicePrincipalSecret(clientId, clientSecret, tenantId, { tokenAudience: 'graph' }, function (err, credentials, subscriptions) {
    if(err){
        console.log('Could not get token', err)
    }

    console.log('Logged In');

    var client = new graphRbacManagementClient(credentials, tenantId);

    console.log("Client created");

    client.groups.list({}, function(err, result){
        if(err){
            console.log('Could not list groups', err)
        }
    })
});

返回的错误是:

{
    "statusCode": 403,
    "request": {
        "rawResponse": false,
        "queryString": {

        },
        "method": "GET",
        "headers": {
            "x-ms-client-request-id": "2b0e7464-bf4f-41d3-8440-38797bf0d72b",
            "accept-language": "en-US",
            "Content-Type": "application/json; charset=utf-8"
        },
        "url": "https://graph.windows.net/5a677fc4-23da-4e7a-a0fa-75f2c53e9c90/groups?api-version=1.6",
        "body": null
    },
    "response": {
        "body": "{\"odata.error\":{\"code\":\"Authorization_RequestDenied\",\"message\":{\"lang\":\"en\",\"value\":\"Insufficient privileges to complete the operation.\"}}}",
        "headers": {
            "cache-control": "no-cache",
            "pragma": "no-cache",
            "content-type": "application/json;odata=minimalmetadata;streaming=true;charset=utf-8",
            "expires": "-1",
            "server": "Microsoft-IIS/8.5",
            "ocp-aad-diagnostics-server-name": "F3xU7bkLCvTOf62bCyNdsiLFnuyfFODP68vB9RmoAS0=",
            "request-id": "f8404560-e300-4cd1-8a4b-a6487b06f7a2",
            "client-request-id": "97cd97fa-448f-44bb-87dc-7d48505e80db",
            "x-ms-dirapi-data-contract-version": "1.6",
            "ocp-aad-session-key": "REMOVED",
            "x-content-type-options": "nosniff",
            "dataserviceversion": "3.0;",
            "strict-transport-security": "max-age=31536000; includeSubDomains",
            "access-control-allow-origin": "*",
            "x-aspnet-version": "4.0.30319",
            "x-powered-by": "ASP.NET, ASP.NET",
            "duration": "1097838",
            "date": "Wed, 05 Oct 2016 14:10:41 GMT",
            "connection": "close",
            "content-length": "139"
        },
        "statusCode": 403
    },
    "body": {
        "code": "Authorization_RequestDenied",
        "message": "Insufficient privileges to complete the operation."
    }
}

为了测试,我已将对 graph 和 azure AD 的所有权限添加到此客户端:

你在 Azure 门户中选择了权限并不意味着你的应用已被授予这些权限。我建议使用像 calebb.net 这样的 JWT 解码器解码您发送到 AAD Graph 的令牌。令牌的 scproles 声明应包含必要的权限,在本例中为 Groups.Read.All.

如果缺少令牌 Groups.Read.All,您需要让租户管理员使用 here 中描述的 prompt=admin_consent 参数来 "consent" 应用程序。这将授予您的应用程序您请求的权限。

如果令牌包含 Groups.Read.All 权限,您应该让我们知道,因为这将是图表中的错误 API。

为了能够调用特定的REST API,我们需要确保足够的权限。组REST需要登录的用户有权限使用

有两种范围,仅限应用程序或委托。仅限应用的范围(也称为应用角色)授予应用该范围提供的全套权限。仅限应用的范围通常由 运行 作为一项服务而没有登录用户的应用使用。

委派权限范围适用于代表用户行事的应用。这些范围委托登录用户的权限,允许应用充当用户。 实际授予应用程序的权限将是范围授予的权限与登录用户拥有的权限的最小权限组合(交集)。例如,如果权限范围授予写入所有目录对象的委托权限,但登录用户只有更新自己的用户配置文件的权限,则应用程序将只能写入登录用户的配置文件,而不能写入其他对象.

此规范是关于 Microsoft Graph 的文档,但它也应该适用于其他 Microsoft 服务。