如何使用系统分配的托管标识保护 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。从那里,您可以使用 caller 的 Managed Identity
(如果适用)通过 AAD 对您的应用程序进行身份验证。这也适用于任何服务主体或用户。
您需要点击函数应用左侧面板上的“身份验证”。然后将 Microsoft AD 添加为身份提供者。
添加必要的设置(您可以让 Azure 创建应用程序注册或使用您已经创建的托管身份。通过这一步,您将锁定您的 Azure 功能应用程序,以便仅在有效的 AD 令牌时触发提供给它。
我有一个带有 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。从那里,您可以使用 caller 的 Managed Identity
(如果适用)通过 AAD 对您的应用程序进行身份验证。这也适用于任何服务主体或用户。
您需要点击函数应用左侧面板上的“身份验证”。然后将 Microsoft AD 添加为身份提供者。
添加必要的设置(您可以让 Azure 创建应用程序注册或使用您已经创建的托管身份。通过这一步,您将锁定您的 Azure 功能应用程序,以便仅在有效的 AD 令牌时触发提供给它。