是否可以在 Azure 函数和 Azure Web API 之间启用托管身份?

Is it possible to enable Managed Identity between Azure function and Azure Web API?

我目前在 Azure FunctionWeb API 之间使用 Basic 身份验证。这不安全,因此我正在寻找替代方案并在 Azure 中找到 managed identity 功能。但是,我没有看到可以在 Web API 和 Azure 函数之间启用此功能。

注意:我们可以在 Azure FunctionKeyVault 之间启用,但不能在 web API 和 azure function 之间启用。

正在寻找如下解决方案

我已经为我的应用服务启用了 Easy Auth:

您可以在高级blade中找到它的客户端ID:

所以我们需要获取此资源的访问令牌以调用 API,只需尝试以下代码(我假设您已为您的函数启用托管身份):

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");
    var endpoint = Environment.GetEnvironmentVariable("IDENTITY_ENDPOINT");
    var identity_header = Environment.GetEnvironmentVariable("IDENTITY_HEADER");
    //chnage your client ID value here.
    var resource = "4df52c7e-3d6f-4865-a499-cebbb2f79d26";
    var requestURL = endpoint + "?resource=" + resource + "&api-version=2019-08-01";

    HttpClient httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Add("X-IDENTITY-HEADER", identity_header);
    HttpResponseMessage response = await httpClient.GetAsync(requestURL);
    response.EnsureSuccessStatusCode();
    string responseBody = await response.Content.ReadAsStringAsync();
    var access_token = JsonConvert.DeserializeObject<TokenResp>(responseBody).access_token;

    //After get access token for app: 4df52c7e-3d6f-4865-a499-cebbb2f79d26, call the API that protected by it
    //chnage your api url here.
    var APIURL = "https://frankapp.azurewebsites.net";
    HttpClient callAPI = new HttpClient();
    callAPI.DefaultRequestHeaders.Add("Authorization","Bearer "+ access_token);
    HttpResponseMessage APIResponse = await callAPI.GetAsync(APIURL);
    //check the response code to see if called the API successfully.
    return new OkObjectResult(APIResponse.StatusCode);
}

public class TokenResp {
 public string access_token { get; set; }
 public string expires_on { get; set; }
 public string resource { get; set; }
 public string token_type { get; set; }
 public string client_id { get; set; }

}

结果:

您好,我看到您在询问 Azure FunctionWeb API 之间的交换,理论上,它应该是您的资源服务器 (Apis) 而不是托管身份。在 Azure AD 之上有关于代表 auth/client 授予凭据的概念。您可以遵循此学习教程 Build Azure functions with Microsoft Graph ,并开始思考您希望自己的身份流程如何 - 简单的方法是使用 on-behalf to azure functions 和 web api,实现访问令牌断言两者共同 类。