我目前正在编写一个 .NET 7 隔离的 Azure 函数。我想配置该函数及其调用方以使用 Azure Key Vault。
我已经让密钥保管库正常工作,一切都已连接,并且可以从应用程序访问密钥。
我不明白的是如何保护端点。我已经按照文档设置了
AuthorizationLevel.Function
:
public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
{
Console.WriteLine(Environment.GetEnvironmentVariable("FunctionApiKey"));
Console.WriteLine((getSecretAsync().GetAwaiter().GetResult()).Value);
_logger.LogInformation("C# HTTP trigger function processed a request.");
var response = req.CreateResponse(HttpStatusCode.OK);
response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
response.WriteString("Welcome to Azure Functions!");
return response;
}
现在,当我在开发环境中调用我的应用程序时,我只需在邮递员中使用简单的 URL 即可触发它,甚至无需提供密钥。所以我不知道授权是否按预期工作,或者 Azure Function 框架是否提供了某种机制来在开发环境中不需要它。
此外,我不明白如何将授权 API 密钥指向 keyvault 密钥。我在
appsettings.local
中设置了以下内容:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"AzureWebJobsSecretStorageType": "keyvault",
"AzureWebJobsSecretStorageKeyVaultUri": "https://<vaultURI>.vault.azure.net/",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
}
}
这是根据此处的文档设置的。但他们没有描述如何将应用程序指向特定的秘密以进行授权。
编辑: 看起来这个问题的答案部分就在我面前:
AzureWebJobsSecretStorageKeyVaultClientSecret <CLIENT_SECRET>
但是我仍然不明白为什么端点在我的开发环境中未经授权运行。
这里有两个独立的东西。
AuthorizationLevel
供消费者使用端点。当您将函数应用程序部署到 Azure 时,它会在不同范围内创建一些初始函数 API 密钥,您可以通过 Azure 门户或 Azure CLI 管理函数应用程序实例上的这些密钥。当您在本地运行此程序时,我不认为函数主机模拟器会强制执行 AuthorizationLevel 或可能使用众所周知的开发人员 API 密钥,就像访问存储帐户模拟器的
UseDeveloperStorage=true
设置一样。我不相信这是可配置的,我不需要尝试。
您部署的函数应用程序可以使用Key Vault 参考。
在本地模拟的主机中,上面的密钥保管库引用作为本地 appsettings 文件中提供的两个
AzureWebJobsSecretStorageKeyVaultClient*
设置公开(仍然不要将其签入源代码管理!)。
Aaa,以防万一您遇到身份验证问题..
向密钥库进行身份验证并检索秘密的方式是
DefaultAzureCredential()
机制。因此,如果您从 Visual Studio 运行它,它可能会落到您的VisualStudioCredential
。如果您使用 dotnet
从命令提示符运行它,您可能会通过浏览器获得交互式登录。