从SPA调用API时委派Azure Active Directory角色

时间:2017-03-21 11:03:25

标签: azure single-page-application azure-active-directory adal rbac

我有一个单页面应用程序(SPA)和一个API。使用基于角色的访问控制(RBAC)使用Azure Active Directory保护两者。我可以使用ADAL登录和查看我的SPA。我也可以登录,调用我的API并查看我给自己的角色声明。

我想从SPA中调用API。我已将API委派的权限添加到SPA。我也点击了“授予权限”按钮,因此我没有看到同意屏幕。

问题是当SPA调用API时,不会出现角色声明,因此API始终返回403 Forbidden响应。我该如何解决这个问题?

更新

这是我的API的清单:

{
  "appId": "[API Client ID]",
  "appRoles": [
    {
      "allowedMemberTypes": [
        "User"
      ],
      "displayName": "Read Device",
      "id": "b2e6f6c2-c3d5-4721-ad49-0eea255ccf45",
      "isEnabled": true,
      "description": "Can read a device.",
      "value": "Device.Read.All"
    }
  ],
  ...
}

在我的SPA中,我正在使用ADAL和adal-angular:

var azureActiveDirectory = {
    'instance': 'https://login.microsoftonline.com/',
    'tenant': '[My Tenant ID]',
    'clientId': '[SPA Client ID]',
    'redirectUri': 'http://localhost:8080/',
    'endpoints': {
      'http://localhost:5000': '[API Client ID]'
    }
adalAuthenticationServiceProvider.init(azureActiveDirectory, $httpProvider);

2 个答案:

答案 0 :(得分:1)

显然,嵌套组中的角色不具有传递性,即如果我是第2组的成员,即使第2组是第2组的成员,我也没有授予第1组的角色:

  • 第1组
    • 具有应用程序1的角色
    • 有一位名为第2组的成员

这种功能尚未实施,这绝对令人难以置信。我已就UserVoice提出建议。请提出建议。

答案 1 :(得分:0)

您应该在API应用程序中创建appRole,当您的spa调用API时,它将获得具有登录用户所属的api应用程序中角色的访问令牌。所以要确保你在api应用程序中创建角色并验证角色,而不是spa应用程序。