Swagger UI 页面的隔离 Azure Function 绕过身份验证中间件

Vli*_*nce 5 azure azure-functions .net-6.0

我创建了一个新的 .NET 6独立Azure 函数。我已经为 Swagger/OpenAPI 添加了特定的 Nuget 包(用于独立):

Microsoft.Azure.Functions.Worker.Extensions.OpenApi v1.3.0
Run Code Online (Sandbox Code Playgroud)

然后,我使用适当的属性装饰我的 HttpTrigger 函数,并在我的内部[OpenApiOperation]正确添加该方法,如下所示:ConfigureOpenApi()Program.cs

Microsoft.Azure.Functions.Worker.Extensions.OpenApi v1.3.0
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作,我可以访问我的 swagger UI url:http://localhost:7001/api/swagger/ui


现在是时候保护我的 Az Function 并添加对JWT token validation. 为此,我遵循了这篇精彩的文章: https://joonasw.net/view/azure-ad-jwt-authentication-in-net-isolated-process-azure-functions

因为我位于一个独立的Azure 函数中,所以我现在可以利用它middleware,而本文正是这样做的。它创建了两个middleware. 所以我像这样添加了它们:

using Microsoft.Azure.Functions.Worker.Extensions.OpenApi.Extensions;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureOpenApi()
    .Build();

host.Run();
Run Code Online (Sandbox Code Playgroud)

问题:

每当我启动 Azure Function 并尝试访问我的 swagger UI url http://localhost:7001/api/swagger/ui

401 unauthorized由于Authentication Middleware我没有标头值,因此我现在得到了 a authorization

我相信我没有authorization标头值是正常的,因为我只是想查看一个 swagger UI url。

如果我来自包含“swagger”一词的网址,如何才能要求他们Authentication middleware不查找标头?authorization

或者有更好/不同的方法来实现这一目标吗?

真诚的感谢

Tho*_*mas 1

查看文档,可以使用UseWhen扩展方法。

您需要至少使用nuget 包的1.8.0-preview1Microsoft.Azure.Functions.Worker版本。(参见github问题

然后在您的代码中您应该能够执行类似的操作:

using Microsoft.Azure.Functions.Worker.Extensions.OpenApi.Extensions;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults((hostContext, builder) =>
    {
        builder.UseWhen<AuthenticationMiddleware>(functionContext =>
        {
            // Only use the middleware if not related to swagger
            // Condition could be improved tho.
            return !functionContext.FunctionDefinition.Name.Contains("Swagger");
        });
        ...
    })
    ...

host.Run();
Run Code Online (Sandbox Code Playgroud)