首页 > 解决方案 > Azure AD 删除已注册应用的权限

问题描述

我正在使用 Azure AD 来保护我的服务到服务调用。(每个服务在 Azure AD 中都有一个应用程序标识)。

示例:Application A想要访问Application B.

我注意到,当Application A使用客户端凭据流(带有证书)请求访问令牌时,会发出一个访问令牌,而无需我明确设置访问权限Application B

这对我来说似乎很奇怪,因为返回的令牌将其受众设置为Application B甚至认为我没有明确授予它访问权限。

如果我理解正确,默认情况下所有注册的应用程序都可以相互访问?

Azure AD 中是否有办法明确要求设置权限以便应用程序相互访问?

下面是Application A所需权限的屏幕截图。如您所见,Application B此处未列出。

在此处输入图像描述

在以下屏幕截图中,我将TodoListService(又名应用程序 B)分配给了所需的权限Application A

在此处输入图像描述

标签: azureazure-active-directoryaccess-token

解决方案


我注意到,当使用客户端凭据流(带有证书)从应用程序 A 请求访问令牌时,会发出一个访问令牌,而无需我明确设置访问应用程序 B 的权限。

是的,这可能有点令人惊讶,我也不知道为什么会这样。

您需要做的是在 API 上定义应用程序权限,然后在客户端上分配它。然后您需要检查调用者在令牌中是否具有所需的应用权限。

我有一篇关于此主题的文章:定义 Azure AD 中的应用程序提供的权限范围和角色

要在 API 上定义应用权限,您必须在 Azure AD 中编辑其清单,并添加成员类型为 Application 的应用角色,例如:

{
  "appRoles": [
  {
    "allowedMemberTypes": [
      "Application"
    ],
    "displayName": "Read all todo items",
    "id": "f8d39977-e31e-460b-b92c-9bef51d14f98",
    "isEnabled": true,
    "description": "Allow the application to read all todo items as itself.",
    "value": "Todo.Read.All"
  }
  ]
}

IIRC 你必须为 id 生成一个 GUID。在 API 上定义此权限后,转到您的客户端应用,并在所需权限中添加应用权限。然后你应该按授予权限来授予应用程序权限。

现在,当客户端使用客户端凭据获取令牌时,令牌将包含:

{
  "roles": [
    "Todo.Read.All"
  ]
}

所以你必须检查它是否存在。


推荐阅读