如何使用系统分配的托管标识保护 Azure Functions

How to protect an Azure Function with System assigned Managed Identity

我有一个带有 HTTP 触发器的简单 azure 函数(Authorization level 设置为 Anonymous

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    return new OkObjectResult("This is a response from secured function.");
}

我想用托管身份保护它,所以我打开了系统分配的身份

并且在我的 AD 企业应用程序注册中,我可以看到创建了一个系统分配的身份,所以我复制了它的应用程序 ID 值

出于测试目的,我想从另一个 azure 函数触发它

public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
{
    var clientID = {application / client ID of system identity}
    var azureServiceTokenProvider = new  AzureServiceTokenProvider();
    var accessToken = await azureServiceTokenProvider.GetAccessTokenAsync(clientID);
    
    // Call secured azure function
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("https://my-secured-function.azurewebsites.net");
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

        var response = await client.GetAsync("/api/HttpTrigger1");
        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();

            return new OkObjectResult(result);
        }
        else
        {
            return new OkObjectResult("Error - " + response.StatusCode);
        }
    }
}

代码有效,它在 HTTP 请求中生成并发送令牌。但是,“安全”的 azure 函数仍然是公开可用的。

问题是我如何保护“安全”的 azure 函数,因此它可以 仅通过使用托管身份的生成令牌 的 HTTP 请求触发。

您在此处启用的 System Assigned Managed Identity 仅通过服务委托人为您的应用提供身份。与 Firewall/IP 限制(您可以使用但我假设您只想在此处依赖身份)不同,这不会阻止任何访问。

你要找的基本上是Authentication with Azure AD。从那里,您可以使用 callerManaged Identity(如果适用)通过 AAD 对您的应用程序进行身份验证。这也适用于任何服务主体或用户。

您需要点击函数应用左侧面板上的“身份验证”。然后将 Microsoft AD 添加为身份提供者。

添加必要的设置(您可以让 Azure 创建应用程序注册或使用您已经创建的托管身份。通过这一步,您将锁定您的 Azure 功能应用程序,以便仅在有效的 AD 令牌时触发提供给它。