【问题标题】:Requests to MS Graph API gives me "Authorization Request Denied - Insufficient privileges to complete the operation"对 MS Graph API 的请求给了我“授权请求被拒绝 - 权限不足,无法完成操作”
【发布时间】:2016-10-19 23:19:22
【问题描述】:

我有一个关于“授权请求被拒绝 - 权限不足,无法完成操作”消息的问题,我不断从我对 Windows Graph API 的请求中收到该消息。

具体来说,我在 Azure 云中工作。我有一个调用 API 的 iOS 移动应用程序。 我已在我的门户中打开“Active Directory 身份验证”。

然后,在客户端(iOS):

[self.todoService.client loginWithProvider:@"windowsazureactivedirectory"
                                controller:self
                                  animated:YES
                                completion:^(MSUser *user, NSError *error) {

                                    if(!error && user) {
                                        [self refresh];

                                    } 
                                }]; //loginWithProvider

所以返回一个有效的 MSUser 对象。我看到 web 登录控制器出现了,我用我的 un/pw 登录,然后它让我可以访问我的 Easy Table 的数据......等等。

现在,我想调用我在 Azure 中创建的名为 getUserData 的 Easy API。因此,我只需像这样插入 invokeAPI 代码(iOS):

[self.todoService.client loginWithProvider:@"windowsazureactivedirectory"
                                controller:self
                                  animated:YES
                                completion:^(MSUser *user, NSError *error) {

                                    if(!error && user) {

                                        //NSMutableDictionary * dict = [NSMutableDictionary dictionary];
                                        //[dict setObject:@YES forKey:@"complete"];

                                        NSLog(@"%s - %@", __FUNCTION__, user);
                                        [self refresh];

                                        [self.todoService.client invokeAPI:@"getUserData"
                                                                      body:nil
                                                                HTTPMethod:@"POST"
                                                                parameters:nil
                                                                   headers:nil
                                                                completion:^(id  _Nullable result, NSHTTPURLResponse * _Nullable response, NSError * _Nullable error) {
                                                                    NSLog(@"%s - API returned response! ", __FUNCTION__);
                                                                    NSLog(@"%@", result); //TODO: user info here!! :D

                                                                }]; //invokAPI

                                    } //if user returned from AAD login is valid

                                }]; //loginWithProvider

调用 API 时一切正常,我可以看到响应数据。

在服务器端(Node JS),我基本上做了 3 件事:

第一个是从请求对象中获取用户对象id:

req.azureMobile.user.getIdentity().then((data) => {
   //get user object ID
}

第二,向https://login.windows.net发出请求,以获取带有用户名/密码的访问令牌。

var options = {
    url: "https://login.windows.net/" + tenant_domain + "/oauth2/token?api-version=1.0",
    method: 'POST',
    form: {
        grant_type: "client_credentials",
        resource: "https://graph.windows.net",
        client_id: clientID,
        client_secret: key
    }
};

req(options, function (err, resp, body) {
    //get the result back
}

我得到了一大堆数据,包括访问令牌。

第三,向https://graph.windows.net/ 发出请求,并提供此访问令牌以及我的用户对象 ID:

var options = {
    url: "https://graph.windows.net/" + tenant_domain + "/users/" + objectId + "?api-version=1.0",
    method: 'GET',
    headers: {
        "Authorization": "Bearer " + access_token
    }
};

这样我可以用户数据。现在,在一个单独的测试订阅中,我在我的 AAD 管理中设置了 AAD 和 Graph 的所有基本读取权限。我成功地取回了用户的完整数据,如下所示:

user =     {
    accountEnabled = 1;
    assignedLicenses =         (
    );
    assignedPlans =         (
    );
    city = xxxxxxxxx;
    country = xxxxxxxxxx;
    department = Dev;
    dirSyncEnabled = "<null>";
    displayName = xxxxxx;
    facsimileTelephoneNumber = "<null>";
    givenName = hehe;
    jobTitle = "iOS dev";
    lastDirSyncTime = "<null>";
    mail = "<null>";
    mailNickname = "xxxxxxxxxx.com#EXT#";
    mobile = "+xx xxx xxxx 3852";
    objectId = "xxxxxxx-2c70-4aab-b261-3b2b97dc5c50";
    objectType = User;
    "odata.metadata" = "https://graph.windows.net/xxxxxxxxxx.onmicrosoft.com/$metadata#directoryObjects/Microsoft.WindowsAzure.ActiveDirectory.User/@Element";
    "odata.type" = "Microsoft.WindowsAzure.ActiveDirectory.User";
    otherMails =         (
        "xxxxxxxxxxxx@gmail.com"
    );
...etc
}

但是,在另一个订阅中,我执行了完全相同的步骤。甚至像这样检查所有权限:

我不断收到“授权请求被拒绝,权限不足”消息。错误为空,所以我知道其他一切都正确完成。

我不知道为什么,因为一切都通过了,我检查了我的所有 AAD 和 Graph 权限。

日志结果:

-----正文-----

'{"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"权限不足,无法完成操作。"}}}'

感谢您的帮助,感谢大家的宝贵时间

【问题讨论】:

  • 通常当用户帐户被添加为Guest 而不是Member 时,我会看到此错误。你能检查一下这个特定的 Azure AD 是否是这种情况吗?为此,您需要使用 Azure AD PowerShell Cmdlet。
  • 好的,我会检查我用来登录此特定 Azure AD 的 un/pw 是来宾还是会员,然后在星期一到来并更新您。
  • 嗨 Gaurav,为了获得适用于应用程序的权限,您必须是全局管理员。我尝试了 3 种不同的类型:计费管理员、服务管理员、用户。这些都不起作用。

标签: ios node.js azure active-directory azure-mobile-services


【解决方案1】:

您可以尝试将您使用的 AD 应用的角色升级为管理员权限。在PowerShell中运行以下命令:

Connect-MsolService
$ClientIdWebApp = '{your_AD_application_client_id}'
$webApp = Get-MsolServicePrincipal –AppPrincipalId $ClientIdWebApp
#use Add-MsolRoleMember to add it to "Company Administrator" role).
Add-MsolRoleMember -RoleName "Company Administrator" -RoleMemberType ServicePrincipal -RoleMemberObjectId $webApp.ObjectId 

【讨论】:

  • 嗨,Gary,经过一段时间后,我们发现我们需要一个“全局管理员”来完成这些步骤。然后,当我们运行应用程序时,我们可以成功查询 Graph API,并获取 User 数据。因此,毕竟是管理员权限。
猜你喜欢
  • 1970-01-01
  • 2016-01-13
  • 2017-11-03
  • 2018-01-24
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
相关资源
最近更新 更多