Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oauth 2.0 Azure Active Directory-如何将后端API应用程序注册限制为特定的客户端应用程序注册_Oauth 2.0_Azure Active Directory_Access Token_Microsoft Identity Platform - Fatal编程技术网

Oauth 2.0 Azure Active Directory-如何将后端API应用程序注册限制为特定的客户端应用程序注册

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和客户端密码,我几乎可以在另一个应用程序中执行相同的操作我想实

我可能完全不知道这是怎么回事,但这正是我想要实现的

在AAD我有

  • 一个名为
    后端api
    的应用程序注册,表示HTTP api
  • 一个名为
    frontend App
    的应用程序注册,代表某个客户端(比如控制台应用程序)
  • 一个名为
    的应用注册另一个应用
    ,与我的解决方案无关
我有一个控制台应用程序,我将我的客户端ID和客户端密码放入
前端应用程序
,我可以使用
后端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租户的管理员才能执行此操作,因为应用程序权限需要获得管理员同意。。所以,并不是所有人都能为他们的应用程序做到这一点。。不过你的想法很好……太好了。这就结束了我在那里的担忧。谢谢你提供的细节。非常有用。