【问题标题】:Permissions required to list Azure AD Groups列出 Azure AD 组所需的权限
【发布时间】:2016-10-06 10:59:11
【问题描述】:

我正在尝试使用 NodeJs 访问 Azure AD 的一些详细信息。我可以获得访问令牌 OK,但是每当我尝试使用 Graph API 调用任何东西(在这种情况下只是所有组的列表)时,它都会说我有 “权限不足,无法完成操作。”

我已经进入 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."
    }
}

为了测试,我已向此客户端添加了图形和 azure AD 的所有权限:

【问题讨论】:

  • 您能否发布完整的错误消息(包括相关 ID 和时间戳)?您还可以发布您配置应用程序拥有的权限的屏幕截图吗?
  • 在完整的错误消息中添加 - 无法在任何地方找到相关 ID,我该如何找到?
  • 您是否检查过在 Azure Functions 之外运行完全相同的东西是否有效?如果没有,那么您可以通过删除对 Azure Functions 的所有引用来简化您的问题。
  • 抱歉,我忘记了 Azure AD Graph API 响应不包含在错误消息正文中。我正在寻找 request-id 标头。
  • 您能否附上您为应用程序配置了哪些权限的屏幕截图?

标签: azure azure-active-directory azure-ad-graph-api


【解决方案1】:

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

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

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

【讨论】:

  • 嗨@dstrockis - 我相信你是对的,但我无法让租户管理员同意(已阅读文章但仍未清除它!) .我认为通过使用客户端密码而不是用户帐户登录,我不必这样做。你能提供一些我可以添加到上面的代码来添加这个同意吗? (或者我只需运行一次即可授予它?)。
  • 另外 - 忘了补充你是对的,我在令牌中根本没有任何角色。
  • @smuff 是否有您最初关注的教程或文章?我想用你需要的说明更新它,管理员同意有点混乱。
  • 并尝试在此处阅读 vittorios 博客文章:cloudidentity.com/blog/2016/10/04/… 它将帮助您了解如何完成管理员同意。
  • 太棒了,这正是我所需要的。我没有意识到在进入新门户时功能发生了变化,然后努力生成正确的链接以征得管理员的同意。现在都完成了。它现在不允许我删除我提供的所有测试权限(显然是验证错误),但这是另一天的另一个问题!
【解决方案2】:

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

有两种范围,仅限应用或委托。仅应用范围(也称为应用角色)授予应用该范围提供的全部权限。仅应用范围通常由在没有登录用户的情况下作为服务运行的应用使用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2018-02-28
    • 2022-01-19
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多