我可能完全不了解这是如何工作的,但这是我想要实现的目标。
在AAD中,我有
backend-api
的应用注册,代表HTTP API frontend-app
的应用注册,代表某些客户端(例如控制台应用)another-app
的应用注册,与我的解决方案无关。我有一个控制台应用程序,其中输入了frontend-app
的客户ID和客户密码,我可以用access_token
的{{1}}请求一个aud
。这太好了,正是我想要的。但是,如果我拥有该应用的客户端ID和客户端密码,则可以从backend-api
进行相同的操作。 我要完成的工作是只允许another-app
换取frontend-app
的{{1}}。
我不太确定如何配置该特定要求。我以为我可能需要在access_token
上为backend-api
appRoles
添加一个allowedMemberTypes
条目,然后授予Application
那个角色,但这并没有对backend-api
。同样,我认为也许frontend-app
需要在企业应用程序下选中“要求用户登录”选项,但是我找不到将another-app
添加为“用户”的方法-可能是错误的方向无论如何。
如果仅通过backend-api
要求AAD发出frontend-app
(access_tokens
声明)的backend-api
的方法是什么?也许这是一个愚蠢的问题,而且这样行不通吗?
答案 0 :(得分:2)
您正在考虑向appRoles
添加backend-api
条目,然后将角色专门分配给frontend-app
的正确方法。
此外,请理解,强制执行此要求,即仅允许使用具有此新角色声明的应用程序,而其他应用程序则不是您的API代码的责任。
接下来,我将介绍2种具体方法。两种方法均在此处的Microsoft文档中进行了说明-Microsoft identity platform and the OAuth 2.0 client credentials flow
方法1-使用应用程序权限或角色
配置您的API应用程序以公开一组应用程序权限(或角色)。
此方法更具说明性,因为您定义了一个应用程序许可权,该许可权需要分配给可以调用您的backend-api
的任何应用程序。
导航到Azure Active Directory>应用程序注册> backend-api
应用程序的应用程序注册>清单
使用json这样添加新的应用角色。
"appRoles": [
{
"allowedMemberTypes": [
"Application"
],
"displayName": "Can invoke my API",
"id": "fc803414-3c61-4ebc-a5e5-cd1675c14bbb",
"isEnabled": true,
"description": "Apps that have this role have the ability to invoke my backend API",
"value": "MyAPIValidClient"
}]
将应用权限分配给您的前端应用
New-AzureADServiceAppRoleAssignment -ObjectId <frontendapp.ObjectId> -PrincipalId <frontendapp.ObjectId> -Id "fc803414-3c61-4ebc-a5e5-cd1675c14bbb" -ResourceId <yourbackendapi.ObjectId>
使用客户端凭据授予权限(即使用clientId和客户端密码)将前端应用程序身份验证为后端api。
现在,在后端api收到的身份验证令牌中,您可以检查角色声明集合中是否包含名为“ MyAPIValidClient”的角色,否则可以拒绝带有未授权异常的呼叫。
方法2-使用访问控制列表
当后端API收到令牌时,它可以对令牌进行解码并从appid
和iss
声明中提取客户端的应用程序ID。然后,它将应用程序与其维护的访问控制列表(ACL)进行比较。
根据您的要求,API可能只向特定客户端授予全部权限的子集或所有权限。
在某些情况下,第二种方法似乎更简单,尽管我更喜欢第一种方法,因为当您具有多个应用程序权限/角色并且根据这些角色提供不同级别的功能时,它可以很好地扩展。
相关的SO帖子和参考