为来自 Azure 函数的调用保护 ASPNET Core Web API

Securing ASPNET Core Web API for calls from Azure Function

我们在 Azure 中有一个现有的 ASP.NET 核心 Web Api,它具有支持 Azure AD 和 Azure AD 安全用户的端点

我想创建一个带有定时触发器的新 Azure 函数,它将调用同一个 Web Api。该调用显然不会在用户的上下文中,而是在函数应用程序的上下文中。

AF 是 AzureFunctionsVersion“v3”,TargetFramework 为“netcoreapp3.1”

我已经为现有网站的应用程序注册添加了一个应用程序角色API

然后我请求从 Azure 门户中的 Azure Functions“Api 权限”blade 访问 API

到目前为止,我只是 运行 这个本地 Azure 函数,所以这里是 local.settings.json 的值。我删除了实际值

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "AzureAd:Instance": "https://login.microsoftonline.com/",
    "AzureAd:Domain": "ourdomain.co.uk",
    "AzureAd:TenantId": "aaaaaaaa-92eb-430b-b902-aaaaaaaaaaaa",
    "AzureAd:ClientId": "aaaaaaaa-bd17-4e69-bdf6-aaaaaaaaaaaa",
    "AzureAd:Audience": "https://ourdomain.co.uk/appid,
    "AzureAd:ClientSecret": "THESECRET",
    "PatientApi:BaseAddress": "https://myapi.com/api/",
    "PatientApi:Scopes": "https://my-api-appiduri/.default"
  },
}  

然后我尝试通过调用 GetAccessTokenForAppAsync

获取 Azure 函数的令牌
 var accessToken = await this.tokenAcquisition.GetAccessTokenForAppAsync(this.patientScope);
            
 this.httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
 this.httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

当我调用 GetAccessTokenForAppAsync 时,出现以下异常

Microsoft.Identity.Client.MsalServiceException: 'A configuration issue is preventing authentication - check the error message from the server for details. You can modify the configuration in the application registration portal. See https://aka.ms/msal-net-invalid-client for details. Original exception: AADSTS7000215: Invalid client secret provided. Ensure the secret being sent in the request is the client secret value, not the client secret ID, for a secret added to app '{CLIENTID_FOR_AZUREFUNCTION}'.

此 AzureAd 配置和调用 GetAccessTokenForAppAsync 的方法是否正确?

在使用 GetAccessTokenForAppAsync 时,您仅通过了范围。

但是GetAccessTokenForAppAsync需要多个参数,例如tenant、authenticationscheme、tokenAcquisitionOptions等。

这可能是您所说 A configuration issue is preventing authentication 错误的原因。

参考下面GetAccessTokenForAppAsync上的documentation以及需要传递的参数的详细说明

您还可以参考以下documentation使用微软身份验证库获取Azure AD令牌。

TL;DR

虽然我已经正确配置了 AzureAd 值,但我必须在某个时候选择在 VS IDE 中“管理用户机密”。它创建了一个不同的 ClientSecret 并且覆盖了 local.settings.json.

中的正确值

感谢 MSAL 团队的这个 GitHub 问题和评论,https://github.com/AzureAD/microsoft-identity-web/issues/379#issuecomment-666526566