真实客户端 IP 还原

This commit is contained in:
2026-08-10 17:35:32 +08:00 Unverified
parent d11d038770
commit f1d6b3d1da
3 changed files with 43 additions and 0 deletions
+30
View File
@@ -1,4 +1,5 @@
using System.Text;
using System.Net;
using System.Text.Json.Serialization;
using Jiaowu.Api.Domain.Identity;
using Jiaowu.Api.Domain.System;
@@ -20,6 +21,7 @@ using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.RateLimiting;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
@@ -111,6 +113,21 @@ var rabbitMqOptions = builder.Configuration
var ssoOptions = builder.Configuration
.GetSection(SsoOptions.SectionName)
.Get<SsoOptions>() ?? new SsoOptions();
var trustedProxyAddresses = builder.Configuration
.GetSection("ReverseProxy:TrustedProxies")
.Get<string[]>() ?? [];
var trustedProxies = trustedProxyAddresses
.Select(value =>
{
if (!IPAddress.TryParse(value, out var address))
{
throw new InvalidOperationException(
$"ReverseProxy:TrustedProxies contains an invalid IP address: '{value}'.");
}
return address;
})
.ToArray();
if (ssoOptions.Enabled &&
(string.IsNullOrWhiteSpace(ssoOptions.ClientId) ||
@@ -554,6 +571,18 @@ if (ssoOptions.Enabled)
});
}
builder.Services.AddAuthorization();
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.ForwardLimit = 1;
options.KnownIPNetworks.Clear();
options.KnownProxies.Clear();
foreach (var proxy in trustedProxies)
{
options.KnownProxies.Add(proxy);
}
});
builder.Services.AddRateLimiter(options =>
{
options.RejectionStatusCode = StatusCodes.Status429TooManyRequests;
@@ -668,6 +697,7 @@ builder.Services.AddSwaggerGen(options =>
var app = builder.Build();
app.UseForwardedHeaders();
app.UseExceptionHandler();
app.UseResponseCompression();
app.Use(async (context, next) =>
+6
View File
@@ -105,6 +105,12 @@
"FrontendBaseUrl": "",
"CallbackUrl": ""
},
"ReverseProxy": {
"TrustedProxies": [
"127.0.0.1",
"::1"
]
},
"Cors": {
"Origins": [
"capacitor://localhost",