我创建了一个新的。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();