Oauth 2.0 Azure Active Directory-如何将后端API应用程序注册限制为特定的客户端应用程序注册
我可能完全不知道这是怎么回事,但这正是我想要实现的 在AAD我有Oauth 2.0 Azure Active Directory-如何将后端API应用程序注册限制为特定的客户端应用程序注册,oauth-2.0,azure-active-directory,access-token,microsoft-identity-platform,Oauth 2.0,Azure Active Directory,Access Token,Microsoft Identity Platform,我可能完全不知道这是怎么回事,但这正是我想要实现的 在AAD我有 一个名为后端api的应用程序注册,表示HTTP api 一个名为frontend App的应用程序注册,代表某个客户端(比如控制台应用程序) 一个名为的应用注册另一个应用,与我的解决方案无关 我有一个控制台应用程序,我将我的客户端ID和客户端密码放入前端应用程序,我可以使用后端api的aud请求访问令牌。这很好,正是我想要的。但是,如果我有另一个应用程序的客户端ID和客户端密码,我几乎可以在另一个应用程序中执行相同的操作我想实
- 一个名为
的应用程序注册,表示HTTP api后端api
- 一个名为
的应用程序注册,代表某个客户端(比如控制台应用程序)frontend App
- 一个名为
,与我的解决方案无关的应用注册另一个应用
前端应用程序
,我可以使用后端api的aud
请求访问令牌
。这很好,正是我想要的。但是,如果我有另一个应用程序的客户端ID和客户端密码,我几乎可以在另一个应用程序中执行相同的操作我想实现的是,只有前端应用程序
才允许获得后端api
的访问令牌
我不太确定如何配置该特定需求。我想也许我需要为后端api
上的allowedMemberTypes
应用程序
添加一个Approvles
条目,然后授予前端应用程序
该角色,但这不会对另一个应用程序
施加任何限制。同样地,我认为可能后端api
需要在企业应用程序下选中它的“需要用户登录”选项,但我找不到一种方法将前端应用程序添加为“用户”
——无论如何,这可能是错误的方向
如果只通过
前端应用程序请求,如何告诉AAD只为后端api
(aud
声明)分发访问令牌?
也许这是个愚蠢的问题,而它就是不这样工作?您的思路是正确的,您考虑将appRoles
条目添加到后端api
,然后专门将角色分配给前端应用程序
此外,请理解强制执行此要求,即仅允许使用此新角色声明的应用程序,而不允许其他应用程序,这是API代码的责任
接下来我将讨论两种具体的方法。这两种方法都在Microsoft文档中进行了说明:
方法1-使用应用程序权限或角色
配置API应用程序以公开一组应用程序权限(或角色)
这种方法更具声明性,因为您定义了需要分配给任何可以调用后端api的应用程序的应用程序权限
导航到Azure Active Directory>应用程序注册>应用程序注册,以获取您的后端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>
新AzureADServiceAppRoleAssignment-ObjectId-PrincipalId-Id“fc803414-3c61-4ebc-a5e5-CD1675C14BB”-资源Id
使用客户端凭据授权(即使用clientId和客户端密码)向后端api验证前端应用程序。。就像你可能已经在做的那样
现在,在后端api接收到的身份验证令牌中,您可以检查角色声明集合是否必须包含名为“MyAPIValidClient”的角色,否则您可以使用未经授权的异常拒绝调用
方法2-使用访问控制列表
当您的后端API收到令牌时,它可以解码令牌并从appid
和iss
声明中提取客户端的应用程序ID。然后将应用程序与其维护的访问控制列表(ACL)进行比较
根据您的要求,API可能只向特定客户端授予完全权限或所有权限的子集
在某些情况下,第二种方法似乎更简单,但我更喜欢第一种方法,因为当您有多个应用程序权限/角色以及基于这些角色提供的不同级别的功能时,它可以很好地扩展
相关SO帖子和参考资料
- 相关SO职位-
- Microsoft文档-
非常有用。因此,总结的答案是。无法阻止AAD从另一个应用程序
-周期向后端api
分发访问令牌。如果我想模拟这一点,则由API代码本身进行身份验证,特别是寻找只有通过frontend app
生成的声明时才应该存在的声明。API代码本身(或过程中的代理-例如API管理
策略)。与对话不太相关,但希望为未来读者澄清。此外,是否有任何方法阻止某人创建自己的应用程序,并在自己的应用程序上调用New AzureADServiceAppRoleAssignment
,以获得此特定应用程序角色?这似乎不会让某个人受到约束,并决心在很长时间内创建自己的客户,如果他们可以添加此角色的话themselves@ckittel只有Azure AD租户的管理员才能执行此操作,因为应用程序权限需要获得管理员同意。。所以,并不是所有人都能为他们的应用程序做到这一点。。不过你的想法很好……太好了。这就结束了我在那里的担忧。谢谢你提供的细节。非常有用。