0

我有一个启用了 Azure Active Directory 身份验证的 Azure 函数(包括“请求未通过身份验证时采取的操作”=“使用 Azure Active Directory 登录”)。此外,选项“需要用户分配?” Azure Function 相关服务主体 (sp_func) 的设置为“是”,以避免租户中的每个人最终都能够运行该函数。

目标是拥有一个添加到 sp_func 的“用户和组”的单个安全组(可以包括用户和服务主体),以便分配给该组来决定是否可以访问该功能。对于用户,这可以正常工作,但对于服务主体 (sp_nonfunc) 则不行。为了让他们 (sp_nonfunc) 工作,我必须为他们设置权限 (sp_nonfunc) 最终允许他们与 Azure 函数交互,无论他们 (sp_nonfunc) 是否分配给组。

是否可以只将服务主体 (sp_nonfunc) 添加到组中,并将组添加到 sp_func,然后能够使用 sp_nonfunc 执行该函数(不授予 sp_nonfunc 显式权限)?

编辑:即使我在清单中定义了自己的 appRole,似乎也无法直接将 sp_nonfunc 添加到 sp_func。目前似乎唯一的方法是为 sp_func 添加 sp_nonfunc 的权限 - 但这是我想要避免的。

EDIT2:这里我是如何在 sp_func 清单中定义角色的

"appRoles": [
    {
        "allowedMemberTypes": [
            "Application"
        ],
        "displayName": "AzureFunctionAccess",
        "id": "xxx-xxx-xxx-xxx-xxx",
        "isEnabled": true,
        "description": "Access Azure Function.",
        "value": "AzureFunctionAccess"
    }
]

EDIT3:当我不直接为 sp_nonfunc 分配角色,而只是将 sp_nonfunc 添加到我得到的安全组时,当https://login.microsoftonline.com/<tenant id>/oauth2/token使用资源 = sp_func 的注册应用程序的应用程序 ID URI 发出请求时:

{
    "error": "invalid_grant",
    "error_description": "AADSTS501051: Application 'xxx-xxx-xx-xx-xx'(xxx) is not assigned to a role for the application 'https://xxx'(xxx).\r\nTrace ID: xxx-xxx-xx-xx-xx\r\nCorrelation ID: xxx-xxx-xx-xx-xx\r\nTimestamp: xx-xx-xx xx:xx:xxZ",
    "error_codes": [
        501051
    ],
    "timestamp": "xx-xx-xx xx:xx:xxZ",
    "trace_id": "5xxx-xxx-xx-xx-xx",
    "correlation_id": "xxx-xxx-xx-xx-xx",
    "error_uri": "https://login.microsoftonline.com/error?code=501051"
}
4

1 回答 1

1

这种方式行不通,要使用服务主体(在您的情况下为sp_nonfunc)获取函数 app( sp_func) 的令牌,您需要为sp_nonfunc.

在门户中导航到与 sp_nonfunc 相关的 App Registration -> API permissions-> 添加AzureFunctionAccess您定义的,最后单击Grant admin consent for xxx按钮。

在此处输入图像描述

然后通过客户端凭据流获取令牌,它将正常工作。(我使用 v2.0 端点,如果您使用 v1.0,它也可以工作。)

关于步骤的更多细节,我之前在这篇文章中写过,你可以参考它。

在此处输入图像描述

于 2020-07-03T06:29:22.317 回答