4

我可能完全不了解它的工作原理,但这是我想要实现的目标。

在 AAD 我有

  • backend-api一个代表 HTTP API的应用注册调用
  • 一个代表某个客户端的应用程序注册frontend-app(比如说一个控制台应用程序)
  • 一个名为 App Registration 的应用程序another-app与我的解决方案无关

我有一个控制台应用程序,我在其中输入了我的客户端 ID 和客户端密码,我frontend-app可以请求一个access_token带有aud. backend-api这很棒,正是我想要的。another-app但是,如果我有该应用程序的客户端 ID 和客户端密码 ,我几乎可以做同样的事情。我想要完成的是只frontend-app允许获得一个access_tokenfor backend-api

我不太确定如何配置该特定要求。我想也许我需要为on添加一个appRoles条目,然后授予该角色,但这并没有对. 同样,我认为可能需要在企业应用程序下检查“需要用户登录”选项,但我找不到添加为“用户”的方法——无论如何可能是错误的方向。allowedMemberTypes Applicationbackend-apifrontend-appanother-appbackend-apifrontend-app

如果仅通过请求 AAD 仅分发(索赔),有access_tokens什么backend-api方法可以告诉他们?audfrontend-app 也许这是一个愚蠢的问题,它只是不这样工作?

4

1 回答 1

4

您正在考虑添加appRoles条目backend-api然后将角色专门分配给frontend-app.

此外,请了解强制执行此要求,即只允许使用此新角色声明的应用程序,但不允许其他应用程序是您的 API 代码的责任。

接下来我将介绍 2 种具体方法。这两种方法都在此处的 Microsoft Docs 中进行了解释-Microsoft 身份平台和 OAuth 2.0 客户端凭据流

方法 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 收到令牌时,它可以解码令牌并从appidandiss声明中提取客户端的应用程序 ID。然后它将应用程序与它维护的访问控制列表 (ACL) 进行比较。

根据您的要求,API 可能仅向特定客户端授予完整权限的子集或所有权限。

在某些情况下,第二种方法可能看起来更简单,尽管我更喜欢第一种方法,因为当您拥有多个应用程序权限/角色以及基于这些角色提供不同级别的功能时,它可以很好地扩展。

相关的 SO 帖子和参考资料

于 2019-05-17T18:12:51.637 回答