用于Swagger UI页面的隔离Azure功能绕过认证中间件



我创建了一个新的。net 6IsolatedAzure的功能。我已经为Swagger/OpenAPI (for Isolated)添加了特定的Nuget包:

Microsoft.Azure.Functions.Worker.Extensions.OpenApi v1.3.0

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

using Microsoft.Azure.Functions.Worker.Extensions.OpenApi.Extensions;
using Microsoft.Extensions.Hosting;
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureOpenApi()
.Build();
host.Run();

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


现在是时候保护我的Az功能并添加对JWT token validation的支持。为了做到这一点,我遵循了这篇伟大的文章:https://joonasw.net/view/azure-ad-jwt-authentication-in-net-isolated-process-azure-functions

因为我在Isolated中Azure Function我现在可以利用middleware,本文就是这样做的。它创建了两个middleware。所以我像这样添加它们:

var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults((context, builder) =>
{
builder.UseMiddleware<AuthenticationMiddleware>();
builder.UseMiddleware<AuthorizationMiddleware>();
})
.ConfigureOpenApi()
.ConfigureServices((context, services) =>
{
...
})
.Build();
host.Run();

问题:

每当我启动我的Azure函数,我试图访问我的swagger UI url http://localhost:7001/api/swagger/ui

我现在得到一个401 unauthorized,因为Authentication Middleware启动,因为我没有一个authorization头值。

我认为这是正常的,我没有一个authorization头值,因为我只是想看看一个swagger UI url。

我怎么能要求Authentication middleware不寻找authorization头,如果我来自一个url,有字"swagger"在吗?

或者是否有更好/不同的方法来实现这一点?

谢谢真诚的

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

你将需要至少使用版本1.8.0-preview1Microsoft.Azure.Functions.Worker的nuget包。(见github issue)

那么在你的代码中,你应该能够这样做:

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();

相关内容

  • 没有找到相关文章

最新更新