Add support for forwarding headers
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
using System.Net;
|
||||||
using FrameProcessor.Concurrency;
|
using FrameProcessor.Concurrency;
|
||||||
using FrameProcessor.Configuration;
|
using FrameProcessor.Configuration;
|
||||||
using FrameProcessor.ImagePipeline;
|
using FrameProcessor.ImagePipeline;
|
||||||
@@ -5,10 +6,13 @@ using FrameProcessor.Middleware;
|
|||||||
using FrameProcessor.Mqtt;
|
using FrameProcessor.Mqtt;
|
||||||
using FrameProcessor.Storage;
|
using FrameProcessor.Storage;
|
||||||
using FrameProcessor.UrlFetch;
|
using FrameProcessor.UrlFetch;
|
||||||
|
using Microsoft.AspNetCore.HttpOverrides;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Microsoft.OpenApi;
|
using Microsoft.OpenApi;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
using AspForwardedHeadersOptions = Microsoft.AspNetCore.Builder.ForwardedHeadersOptions;
|
||||||
|
using ForwardedHeadersOptions = FrameProcessor.Configuration.ForwardedHeadersOptions;
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
@@ -135,6 +139,9 @@ builder.Services.AddOptions<ApiKeyOptions>()
|
|||||||
.ValidateDataAnnotations()
|
.ValidateDataAnnotations()
|
||||||
.ValidateOnStart();
|
.ValidateOnStart();
|
||||||
|
|
||||||
|
builder.Services.AddOptions<ForwardedHeadersOptions>()
|
||||||
|
.Bind(builder.Configuration.GetSection(ForwardedHeadersOptions.SectionName));
|
||||||
|
|
||||||
// FramesOptions is bound but not validated via the options pipeline so that
|
// FramesOptions is bound but not validated via the options pipeline so that
|
||||||
// IOptionsMonitor<FramesOptions> can fire OnChange with invalid content during
|
// IOptionsMonitor<FramesOptions> can fire OnChange with invalid content during
|
||||||
// hot-reload without throwing. FramesRegistry takes responsibility for both
|
// hot-reload without throwing. FramesRegistry takes responsibility for both
|
||||||
@@ -169,6 +176,25 @@ var app = builder.Build();
|
|||||||
// Eagerly resolve FramesRegistry so an invalid frames.json fails startup fast.
|
// Eagerly resolve FramesRegistry so an invalid frames.json fails startup fast.
|
||||||
_ = app.Services.GetRequiredService<FramesRegistry>();
|
_ = app.Services.GetRequiredService<FramesRegistry>();
|
||||||
|
|
||||||
|
// Honor X-Forwarded-Proto/Host from the reverse proxy so generated URLs
|
||||||
|
// (OpenAPI, Swagger UI) use the externally-visible scheme and host.
|
||||||
|
var proxyConfig = app.Services.GetRequiredService<IOptions<ForwardedHeadersOptions>>().Value;
|
||||||
|
var forwardedHeadersOptions = new AspForwardedHeadersOptions
|
||||||
|
{
|
||||||
|
ForwardedHeaders = ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost,
|
||||||
|
};
|
||||||
|
forwardedHeadersOptions.KnownIPNetworks.Clear();
|
||||||
|
forwardedHeadersOptions.KnownProxies.Clear();
|
||||||
|
foreach (var network in proxyConfig.KnownNetworks)
|
||||||
|
{
|
||||||
|
forwardedHeadersOptions.KnownIPNetworks.Add(System.Net.IPNetwork.Parse(network));
|
||||||
|
}
|
||||||
|
foreach (var proxy in proxyConfig.KnownProxies)
|
||||||
|
{
|
||||||
|
forwardedHeadersOptions.KnownProxies.Add(IPAddress.Parse(proxy));
|
||||||
|
}
|
||||||
|
app.UseForwardedHeaders(forwardedHeadersOptions);
|
||||||
|
|
||||||
app.MapOpenApi();
|
app.MapOpenApi();
|
||||||
app.UseSwaggerUI(options =>
|
app.UseSwaggerUI(options =>
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user