我有一个单页面应用程序(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);
答案 0 :(得分:1)
显然,嵌套组中的角色不具有传递性,即如果我是第2组的成员,即使第2组是第2组的成员,我也没有授予第1组的角色:
这种功能尚未实施,这绝对令人难以置信。我已就UserVoice提出建议。请提出建议。
答案 1 :(得分:0)
您应该在API应用程序中创建appRole,当您的spa调用API时,它将获得具有登录用户所属的api应用程序中角色的访问令牌。所以要确保你在api应用程序中创建角色并验证角色,而不是spa应用程序。