为来自 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
我们在 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