我正在构建Azure Function App v2.x(.NET Core 2,.csproj)并构建一个docker镜像(Ubuntu) . 在本地运行docker镜像时,我想要一些方法来区分我的环境,以便在容器中运行Azure Function Runtime 2.x时允许匿名访问 .
更新#2:我've not fallen into a pit of success when running a Function within a Docker container using Azure Functions Runtime - I'并不孤单 . 因此,我建议公开一个环境变量,以便为了本地或其他自定义托管情况而覆盖功能键 .
从长远来看,可能会利用Key Vault来配置访问密钥,并且无论函数在何处运行,都可以引用它 . 这一切都取决于Azure功能在作为微服务平台方面所采用的范围,但很明显,AuthN故事对于运行时来说相当不完整 .
更新#1:作为Kamil注释,Azure Functions CLI隐式"local",因此无论如何都绕过授权 . 这解释了VS 2017中的调试行为,但我仍在尝试制定一种策略来处理在Docker中运行的基于C#类库的Azure Functions 2.x中的auth . 基本上,如何在运行时影响HttpTrigger配置? Azure Functions的其他变体可以在部署时自由修改function.json中的绑定 .
我在GitHub上有一个sample来说明,但我会在这里继续解释 .
原始问题:在Visual Studio 2017中进行本地调试时,我假设它正在修改functions.json以使所有内容变得无关紧要 . 所以即使我有这样的功能:
public static async Task<HttpResponseMessage> Function(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req,
TraceWriter log)
VS2017将允许我拨打Postman的电话,没有多余的装饰 . 但是,一旦在Azure中运行,它将期望查询字符串参数或HTTP标头[x-functions-key]以便授权请求 .
(乔伊没有使用钥匙)
但是,当我从构建输出文件夹中构建一个docker镜像,然后在容器中运行相同的代码时......
docker build -t azfunc-sample <path_to_output_folder>
docker run -p 2077:80 azfunc-sample
我在“AuthorizeLevel.Function”上从容器中获取了一个HTTP 401,但当然,“AuthorizeLevel.Anonymous”仍然没问题 .
这是有道理的,因为Docker中的Azure函数运行时不知道它是在本地运行还是在某些Linux VM上运行,但不知怎的,我需要一种方法来告诉它做VS 2017的工作 . 使用已编译的Azure函数,我相信function.json已生成,我没有看到使用环境变量参数化HTTP绑定的明显方法 .
1 回答
你是部分正确的 - 事实上,即使使用
Function
或Admin
键来保护函数本地的方式,你可以访问它,因为它是Anonymous
访问,它是使用Azure Functions CLI
而不是真正的运行时 . 在CLI中,安全和不安全功能之间没有区别,您可以在以下代码中看到:它只使用没有附加键的路由 . 当在容器内运行函数时,还会附加运行时,因此它在 Cloud 中托管 .