首页 文章

在Docker容器上的Azure Function Apps Runtime 2.x中运行csproj函数时,如何根据环境条件设置AuthorzationLevel?

提问于
浏览
0

我正在构建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]以便授权请求 .

Implicitly anonymous access
(乔伊没有使用钥匙)

但是,当我从构建输出文件夹中构建一个docker镜像,然后在容器中运行相同的代码时......

docker build -t azfunc-sample <path_to_output_folder>

docker run -p 2077:80 azfunc-sample

我在“AuthorizeLevel.Function”上从容器中获取了一个HTTP 401,但当然,“AuthorizeLevel.Anonymous”仍然没问题 .

No anonymous access

这是有道理的,因为Docker中的Azure函数运行时不知道它是在本地运行还是在某些Linux VM上运行,但不知怎的,我需要一种方法来告诉它做VS 2017的工作 . 使用已编译的Azure函数,我相信function.json已生成,我没有看到使用环境变量参数化HTTP绑定的明显方法 .

1 回答

  • 2

    你是部分正确的 - 事实上,即使使用 FunctionAdmin 键来保护函数本地的方式,你可以访问它,因为它是 Anonymous 访问,它是使用 Azure Functions CLI 而不是真正的运行时 . 在CLI中,安全和不安全功能之间没有区别,您可以在以下代码中看到:

    private void DisplayHttpFunctionsInfo(WebScriptHostManager hostManager, Uri baseUri)
    {
        if (hostManager != null)
        {
            var httpFunctions = hostManager.Instance.Functions.Where(f => f.Metadata.IsHttpFunction());
            if (httpFunctions.Any())
            {
                ColoredConsole
                    .WriteLine()
                    .WriteLine(Yellow("Http Functions:"))
                    .WriteLine();
            }
    
            foreach (var function in httpFunctions)
            {
                var httpRoute = function.Metadata.Bindings.FirstOrDefault(b => b.Type == "httpTrigger").Raw["route"]?.ToString();
                httpRoute = httpRoute ?? function.Name;
                var extensions = hostManager.Instance.ScriptConfig.HostConfig.GetService<IExtensionRegistry>();
                var httpConfig = extensions.GetExtensions<IExtensionConfigProvider>().OfType<HttpExtensionConfiguration>().Single();
                var hostRoutePrefix = httpConfig.RoutePrefix ?? "api/";
                hostRoutePrefix = string.IsNullOrEmpty(hostRoutePrefix) || hostRoutePrefix.EndsWith("/")
                    ? hostRoutePrefix
                    : $"{hostRoutePrefix}/";
                var url = $"{baseUri.ToString()}{hostRoutePrefix}{httpRoute}";
                ColoredConsole
                    .WriteLine($"\t{Yellow($"{function.Name}:")} {Green(url)}")
                    .WriteLine();
            }
        }
    

    它只使用没有附加键的路由 . 当在容器内运行函数时,还会附加运行时,因此它在 Cloud 中托管 .

相关问题