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

标签 azure-functions azure-web-app-service azure-functions-runtime

我正在构建 Azure Function App v2.x(.NET Core 2、.csproj)并构建 docker 镜像 (Ubuntu)。在本地运行 docker 镜像时,我希望通过某种方式来区分我的环境,以便在容器内在 Azure Function Runtime 2.x 中运行时允许匿名访问。

更新 #2:在使用 Azure Functions Runtime 在 Docker 容器中运行函数时,我并没有陷入成功的陷阱 - 我并不孤单。所以我有 taken to User Voice建议公开一个环境变量以允许为了本地或其他自定义托管情况覆盖功能键。

从长远来看,也许可以利用 Key Vault 来配置访问 key ,并且无论该功能在哪里运行都可以被引用。这一切都取决于 Azure 函数作为微服务平台的作用范围,但很明显 AuthN 故事对于运行时来说相当不完整。

更新 #1:作为 Kamil请注意,Azure Functions CLI 是隐式“本地”,因此无论如何都会绕过授权。这解释了 VS 2017 中的调试行为,但我仍在尝试制定在 Docker 中运行的基于 C# 类库的 Azure Functions 2.x 中处理身份验证的策略。本质上,我如何在运行时影响 HttpTrigger 配置? Azure Functions 的其他变体可以在部署时自由修改 function.json 中的绑定(bind)。

我有一个 sample在 GitHub 上进行说明,但我也会在这里继续解释。

原问题:
在 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 header [x-functions-key] 来授权请求​​。

Implicitly anonymous access
(乔伊没有使用 key )

但是,当我从构建输出文件夹构建 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 Functions 运行时不知道它是在本地运行还是在某些 Linux VM 上运行,但不知何故,我需要一种方法来告诉它执行 VS 2017 所做的事情。使用已编译的 Azure 函数,我相信生成了 function.json 并且我没有看到使用环境变量参数化 HTTP 绑定(bind)的明显方法。

最佳答案

您是部分正确的 - 事实上,即使使用 Function 保护功能在本地的方式也是如此或 Admin key ,您可以照原样访问它 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();
        }
    }

它只使用没有附加 key 的路由。在容器中运行函数时,还会附加一个运行时,因此它可以作为托管在云中的方式工作。

关于azure-functions - 在 Docker 容器上运行 Azure Function Apps Runtime 2.x 中的 csproj 函数时,如何根据环境条件设置 AuthorzationLevel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52174892/

相关文章:

node.js - node_modules 在 Azure 中使用本地 git 一遍又一遍地提交问题

c# - 在 Azure Function 中使用配置管理器

c# - Azure EventHub函数触发默认重试机制

c# - 如何确保具有相同Person ID的消息以单例方式执行,而不同消息则以并行方式执行?

asp.net-mvc - Azure AD 基于角色的身份验证,User.IsInRole()

mysql - Azure 中的 ASP.NET MVC 应用程序与应用程序内的 MySQL

Azure Function 给出错误 : System. 此平台不支持绘图

python - Azure pyodbc.Error : ('01000' , "[01000][unixODBC][Driver Manager]Can' t 打开 lib 'ODBC Driver 17 for SQL Server':找不到文件 (0) (SQLDriverConnect)

azure - 如何在 Azure(而不是 AWS 亚马逊)上构建无服务器网站

azure - 如何使函数应用程序以读写模式运行