Konfigurera ASP.NET Core att fungera med proxyservrar och lastbalanserare
Not
Det här är inte den senaste versionen av den här artikeln. För den aktuella utgåvan, se .NET 9-versionen av den här artikeln.
Varning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i .NET och .NET Core Support Policy. Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.
Viktig
Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.
Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.
Av Chris Ross
I den rekommenderade konfigurationen för ASP.NET Core hanteras appen med hjälp av ASP.NET Core Module (ANCM) för IIS, Nginx eller Apache. Proxyservrar, lastbalanserare och andra nätverksinstallationer döljer ofta information om begäran innan den når appen:
- När HTTPS-begäranden proxas via HTTP förloras det ursprungliga schemat (HTTPS) och måste skickas vidare i en header.
- Eftersom en app tar emot en begäran från proxyn och inte dess sanna källa på Internet eller företagsnätverket, måste den ursprungliga klientens IP-adress också vidarebefordras i ett fält.
Den här informationen kan vara viktig vid bearbetning av begäranden, till exempel vid omdirigeringar, autentisering, länkgenerering, principutvärdering och klientgeolocation.
Appar som är avsedda att köras på en webbgrupp bör läsa Host ASP.NET Core i en webbgrupp.
Vidarebefordrade rubriker
Enligt konventionen vidarebefordrar proxyservrar information i HTTP-huvuden.
Rubrik | Beskrivning |
---|---|
X-Forwarded-For (XFF) |
Innehåller information om klienten som initierade begäran och efterföljande proxyservrar i en kedja med proxyservrar. Den här parametern kan innehålla IP-adresser och, om du vill, portnummer. I en kedja med proxyservrar anger den första parametern klienten där begäran först gjordes. Efterföljande proxyidentifierare följer. Den sista proxyn i kedjan finns inte i listan med parametrar. Den senaste proxyns IP-adress, och eventuellt ett portnummer, är tillgängliga som fjärr-IP-adress på transportlagret. |
X-Forwarded-Proto (XFP) |
Värdet för det ursprungliga schemat, HTTP eller HTTPS. Värdet kan också vara en lista över scheman om begäran har passerat flera proxyservrar. |
X-Forwarded-Host (XFH) |
Det ursprungliga värdet för fältet Värdhuvud. Vanligtvis ändrar proxyservrar inte värdrubriken. Se Microsoft Security Advisory CVE-2018-0787 för information om en säkerhetsrisk med utökade privilegier som påverkar system där proxyn inte validerar eller begränsar värdhuvuden till kända goda värden. |
X-Forwarded-Prefix |
Den ursprungliga basstigen som efterfrågades av klienten. Den här huvudrubriken kan vara användbar för applikationer att korrekt generera URL:er, omdirigeringar eller länkar tillbaka till klienten. |
Mellanprogram för vidarebefordrade rubriker, ForwardedHeadersMiddleware, läser dessa rubriker och fyller i de associerade fälten i HttpContext.
Mellanprogrammet uppdateras:
-
HttpContext.Connection.RemoteIpAddress
: Ställ in med hjälp avX-Forwarded-For
-huvudvärdet. Ytterligare inställningar påverkar hur mellanprogrammet sätterRemoteIpAddress
. För mer information, se alternativen för Vidarebefordrade rubriker-mellanprogram. De förbrukade värdena tas bort frånX-Forwarded-For
och det gamla värdet förHttpContext.Connection.RemoteIpAddress
sparas iX-Original-For
. Obs! Den här processen kan upprepas flera gånger om det finns flera värden iX-Forwarded-For/Proto/Host/Prefix
, vilket resulterar i flera värden som flyttas tillX-Original-*
, inklusive den ursprungligaRemoteIpAddress/Host/Scheme/PathBase
. -
HttpContext.Request.Scheme
: Ställ in med hjälp av värdet iX-Forwarded-Proto
-huvudet. Det förbrukade värdet tas bort frånX-Forwarded-Proto
och det gamla värdet förHttpContext.Request.Scheme
sparas iX-Original-Proto
. -
HttpContext.Request.Host
: Ange med hjälp av värdet iX-Forwarded-Host
-headern. Det förbrukade värdet tas bort frånX-Forwarded-Host
och det gamla värdet förHttpContext.Request.Host
sparas iX-Original-Host
. -
HttpContext.Request.PathBase
: Ange med hjälp avX-Forwarded-Prefix
-huvudvärdet. Det förbrukade värdet tas bort frånX-Forwarded-Prefix
och det gamla värdet förHttpContext.Request.PathBase
sparas iX-Original-Prefix
.
Mer information om föregående finns i det här GitHub-ärendet.
Mellanprogrammet för vidarebefordrade rubriker standardinställningar kan konfigureras. För standardinställningarna:
- Det finns bara en proxy mellan appen och källan för begäranden.
- Endast loopback-adresser konfigureras för kända proxyservrar och kända nätverk.
- De vidarebefordrade rubrikerna heter
X-Forwarded-For
,X-Forwarded-Proto
,X-Forwarded-Host
ochX-Forwarded-Prefix
. - Värdet
ForwardedHeaders
ärForwardedHeaders.None
, och de önskade vidarebefordrarna måste anges här för att aktivera mellanvaran.
Inte alla nätverksenheter lägger till X-Forwarded-For
- och X-Forwarded-Proto
-huvuden utan ytterligare konfiguration. Läs installationstillverkarens vägledning om proxied-begäranden inte innehåller dessa rubriker när de når appen. Om installationen använder andra rubriknamn än X-Forwarded-For
och X-Forwarded-Proto
anger du alternativen ForwardedForHeaderName och ForwardedProtoHeaderName så att de matchar huvudnamnen som används av installationen. Mer information finns i Alternativ för vidarebefordrade huvudmellanprogram och Konfiguration för en proxy som använder olika rubriknamn.
IIS/IIS Express- och ASP.NET Core-modul
Vidarebefordrade rubriker Middleware är som standard aktiverad av IIS Integration Middleware när appen körs utanför processen bakom IIS och ASP.NET Core Module (ANCM) för IIS. Mellanprogram för vidarebefordrade headers aktiveras för att köras först i pipelinen för mellanprogram med en begränsad konfiguration som är specifik för ASP.NET Core modulen. Den begränsade konfigurationen beror på förtroendeproblem med vidarebefordrade huvuden, till exempel IP-förfalskning. Mellanprogrammet är konfigurerat för att vidarebefordra X-Forwarded-For
- och X-Forwarded-Proto
-huvuden och är begränsat till en enda localhost-proxy. Om ytterligare konfiguration krävs kan du läsa Vidarebefordrade rubriker Middleware-alternativen .
Andra scenarier för proxyserver och lastbalanserare
Förutom att använda IIS-integrering när du värd för out-of-process-, är mellanprogrammet för vidarebefordrade rubriker inte aktiverat som standard. Mellanprogram för vidarebefordrade rubriker måste vara aktiverat för att en app ska kunna hantera vidarebefordrade rubriker med UseForwardedHeaders. När du har aktiverat mellanprogrammet om inga ForwardedHeadersOptions har angetts för mellanprogrammet är standardvärdet ForwardedHeadersOptions.ForwardedHeadersForwardedHeaders.None.
Konfigurera mellanprogrammet med ForwardedHeadersOptions för att vidarebefordra X-Forwarded-For
- och X-Forwarded-Proto
-rubrikerna.
Middleware-ordning för vidarebefordrade rubriker
Vidarebefordrade rubriker Mellanprogram ska köras före andra mellanprogram. Den här ordningen säkerställer att mellanprogrammet som förlitar sig på vidarebefordrad rubrikinformation kan använda huvudvärdena för bearbetning. Mellanprogram för vidarebefordrade headers måste köras efter diagnostik och felhantering, men det måste köras innan UseHstsanropas.
using Microsoft.AspNetCore.HttpOverrides;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseForwardedHeaders();
app.UseHsts();
}
else
{
app.UseDeveloperExceptionPage();
app.UseForwardedHeaders();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Du kan också anropa UseForwardedHeaders
före diagnostik:
using Microsoft.AspNetCore.HttpOverrides;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
var app = builder.Build();
app.UseForwardedHeaders();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Not
Om inga ForwardedHeadersOptions anges eller tillämpas direkt på tilläggsmetoden med UseForwardedHeadersär standardrubrikerna som ska vidarebefordras ForwardedHeaders.None. Egenskapen ForwardedHeaders måste konfigureras med rubrikerna för att vidarebefordra.
Nginx-konfiguration
För att vidarebefordra X-Forwarded-For
- och X-Forwarded-Proto
-huvudena, se Värd ASP.NET Core på Linux med Nginx. Mer information finns i NGINX: Använda rubriken Vidarebefordrad.
Apache-konfiguration
X-Forwarded-For
läggs till automatiskt. Mer information finns i Apache-modulen mod_proxy: Sidhuvuden för omvända proxybegäranden.
Alternativ för vidarebefordrade huvud mellanlagringsprogram
ForwardedHeadersOptions kontrollera beteendet hos vidarebefordrade Headers mellanmjukvara. I följande exempel ändras standardvärdena:
- Begränsar antalet poster i de vidarebefordrade rubrikerna till
2
. - Lägger till en känd proxyadress för
127.0.10.1
. - Ändrar det vidarebefordrade rubriknamnet från standardnamnet
X-Forwarded-For
tillX-Forwarded-For-My-Custom-Header-Name
.
using System.Net;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardLimit = 2;
options.KnownProxies.Add(IPAddress.Parse("127.0.10.1"));
options.ForwardedForHeaderName = "X-Forwarded-For-My-Custom-Header-Name";
});
var app = builder.Build();
app.UseForwardedHeaders();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Alternativ | Beskrivning |
---|---|
AllowedHosts | Begränsar värdar efter X-Forwarded-Host -huvudet till de värden som anges.
IList<string> . |
ForwardedForHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XForwardedForHeaderName. Det här alternativet används när proxyn/vidarebefordraren inte använder X-Forwarded-For -huvudet, men använder en annan rubrik för att vidarebefordra informationen.Standardvärdet är X-Forwarded-For . |
ForwardedHeaders | Identifierar vilka vidarebefordrare som ska bearbetas. Se ForwardedHeaders Enum för listan över fält som gäller. Typiska värden som tilldelats den här egenskapen är ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto .Standardvärdet är ForwardedHeaders.None. |
ForwardedHostHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XForwardedHostHeaderName. Det här alternativet används när proxyn/vidarebefordraren inte använder X-Forwarded-Host -huvudet, men använder en annan rubrik för att vidarebefordra informationen.Standardvärdet är X-Forwarded-Host . |
ForwardedProtoHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XForwardedProtoHeaderName. Det här alternativet används när proxyn/vidarebefordraren inte använder X-Forwarded-Proto -huvudet, men använder en annan rubrik för att vidarebefordra informationen.Standardvärdet är X-Forwarded-Proto . |
ForwardLimit | Begränsar antalet poster i rubrikerna som bearbetas. Ange till null för att inaktivera gränsen, men detta bör endast göras om KnownProxies eller KnownNetworks har konfigurerats. Att ange ett icke-null värde är en försiktighetsåtgärd (men inte en garanti) för att skydda mot felkonfigurerade proxyservrar och skadliga begäranden som kommer från sidokanaler i nätverket.Vidarebefordrade rubriker Mellanprogram bearbetar rubriker i omvänd ordning från höger till vänster. Om standardvärdet ( 1 ) används bearbetas endast det högra värdet från rubrikerna om inte värdet för ForwardLimit ökas.Standardvärdet är 1 . |
KnownNetworks | Adressintervall för kända nätverk som du kan acceptera vidarebefordrade huvuden från. Ange IP-intervall med CIDR-notation (Classless Interdomain Routing). Om servern använder socketar med dubbla lägen anges IPv4-adresser i IPv6-format (till exempel 10.0.0.1 i IPv4 som representeras i IPv6 som ::ffff:10.0.0.1 ). Se IPAddress.MapToIPv6. Kontrollera om det här formatet krävs genom att titta på HttpContext.Connection.RemoteIpAddress.Standardvärdet är en IList <IPNetwork> som innehåller en enda post för new IPNetwork(IPAddress.Loopback, 8) . |
KnownProxies | Adresser till kända proxyservrar som du kan acceptera vidarebefordrade huvuden från. Använd KnownProxies för att ange exakta IP-adressmatchningar.Om servern använder socketar med dubbla lägen anges IPv4-adresser i IPv6-format (till exempel 10.0.0.1 i IPv4 som representeras i IPv6 som ::ffff:10.0.0.1 ). Se IPAddress.MapToIPv6. Kontrollera om det här formatet krävs genom att titta på HttpContext.Connection.RemoteIpAddress.Standardvärdet är en IList <IPAddress> som innehåller en enda post för IPAddress.IPv6Loopback . |
OriginalForHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XOriginalForHeaderName. Standardvärdet är X-Original-For . |
OriginalHostHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XOriginalHostHeaderName. Standardvärdet är X-Original-Host . |
OriginalProtoHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XOriginalProtoHeaderName. Standardvärdet är X-Original-Proto . |
RequireHeaderSymmetry | Kräv att antalet rubrikvärden är synkroniserade när ForwardedHeadersOptions.ForwardedHeaders bearbetas. Standardvärdet i ASP.NET Core 1.x är true . Standardvärdet i ASP.NET Core 2.0 eller senare är false . |
Scenarier och användningsfall
När det inte går att lägga till vidarebefordrade headers och alla förfrågningar är säkra
I vissa fall kanske det inte går att inkludera vidarebefordrade headers i de begäranden som skickas till appen. Om proxyn framtvingar att alla offentliga externa begäranden är HTTPS kan schemat ställas in manuellt innan du använder någon typ av mellanprogram:
using Microsoft.AspNetCore.HttpOverrides;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
var app = builder.Build();
app.Use((context, next) =>
{
context.Request.Scheme = "https";
return next(context);
});
app.UseForwardedHeaders();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Den här koden kan inaktiveras med en miljövariabel eller annan konfigurationsinställning i en utvecklings- eller mellanlagringsmiljö:
using Microsoft.AspNetCore.HttpOverrides;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
var app = builder.Build();
if (!app.Environment.IsProduction())
{
app.Use((context, next) =>
{
context.Request.Scheme = "https";
return next(context);
});
}
app.UseForwardedHeaders();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Arbeta med sökvägsbas och proxyservrar som ändrar begärandesökvägen
Vissa proxyservrar skickar sökvägen intakt men med en appbassökväg som ska tas bort så att routningen fungerar korrekt. UsePathBaseExtensions.UsePathBase mellanprogram delar upp sökvägen i HttpRequest.Path och appens bassökväg i HttpRequest.PathBase.
Om /foo
är appbassökvägen för en proxysökväg som skickas som /foo/api/1
anger mellanprogrammet Request.PathBase
till /foo
och Request.Path
till /api/1
med följande kommando:
app.UsePathBase("/foo");
// ...
app.UseRouting();
Anteckning
När du använder WebApplication (se Migrera från ASP.NET Core 5.0 till 6.0) måste app.UseRouting
anropas efter UsePathBase
så att routningsmellanprogrammet kan observera den ändrade sökvägen innan du matchar vägar. Annars matchas vägar innan sökvägen skrivs om av UsePathBase
enligt beskrivningen i artiklarna Middleware Ordering och Routning.
Den ursprungliga sökvägen och sökvägsbasen tillämpas igen när mellanprogrammet anropas igen i omvänd ordning. Mer information om orderbearbetning av mellanprogram finns i ASP.NET Core Middleware.
Om proxyn trimmar sökvägen (till exempel vidarebefordran /foo/api/1
till /api/1
) korrigerar du omdirigeringar och länkar genom att ange begärans PathBase-egenskap:
app.Use((context, next) =>
{
context.Request.PathBase = new PathString("/foo");
return next(context);
});
Om proxyn lägger till sökvägsdata tar du bort en del av sökvägen för att åtgärda omdirigeringar och länkar med hjälp av StartsWithSegments och tilldela till egenskapen Path:
app.Use((context, next) =>
{
if (context.Request.Path.StartsWithSegments("/foo", out var remainder))
{
context.Request.Path = remainder;
}
return next(context);
});
Konfiguration för en proxy som använder olika rubriknamn
Om proxyn inte använder rubriker med namnet X-Forwarded-For
och X-Forwarded-Proto
för att vidarebefordra proxyadressen/porten och ursprunglig schemainformation anger du alternativen ForwardedForHeaderName och ForwardedProtoHeaderName för att matcha huvudnamnen som används av proxyn:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedForHeaderName = "HeaderNamUsedByProxy_X-Forwarded-For_Header";
options.ForwardedProtoHeaderName = "HeaderNamUsedByProxy_X-Forwarded-Proto_Header";
});
var app = builder.Build();
app.UseForwardedHeaders();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Vidarebefordra schemat för Linux och icke-IIS omvänd proxytjänst
Appar som anropar UseHttpsRedirection och UseHsts placerar en webbplats i en oändlig loop om den distribueras till en Azure Linux App Service, en virtuell Azure Linux-dator (VM) eller bakom någon annan omvänd proxyserver förutom IIS. TLS avslutas av den omvända proxyn och Kestrel blir inte medvetet om rätt begärandeschema. OAuth och OIDC misslyckas också i den här konfigurationen eftersom de genererar felaktiga omdirigeringar. UseIISIntegration lägger till och konfigurerar vidarebefordrade huvudmellanprogram när de körs bakom IIS, men det finns ingen matchande automatisk konfiguration för Linux (Apache- eller Nginx-integrering).
Om du vill vidarebefordra schemat från proxyn i icke-IIS-situationer aktiverar du mellanprogrammet för vidarebefordrade rubriker genom att ange ASPNETCORE_FORWARDEDHEADERS_ENABLED
till true
. Varning! Den här flaggan använder inställningar som är utformade för molnmiljöer och aktiverar inte funktioner som KnownProxies option
för att begränsa vilka IP-adresser som vidarebefordrare accepteras från.
Vidarebefordring av certifikat
Blått
Information om hur du konfigurerar Azure App Service för vidarebefordring av certifikat finns i Konfigurera ömsesidig TLS-autentisering för Azure App Service. Följande vägledning gäller för att konfigurera ASP.NET Core-appen.
- Konfigurera Mellanprogram för vidarebefordran av certifikat för för att ange det rubriknamn som Azure använder. Lägg till följande kod för att konfigurera den header från vilken middleware bygger ett certifikat.
- Anropa UseCertificateForwarding innan anropet till UseAuthentication.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddCertificateForwarding(options =>
options.CertificateHeader = "X-ARR-ClientCert");
var app = builder.Build();
app.UseCertificateForwarding();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.UseAuthentication();
app.MapRazorPages();
app.Run();
Andra webbproxytjänster
Om en proxy används som inte är IIS eller Azure App Service's Application Request Routing (ARR) konfigurerar du proxyn för att vidarebefordra certifikatet som den tog emot i ett HTTP-huvud.
- Konfigurera Mellanprogrammet för vidarebefordran av certifikat för att ange namnet på rubriken. Lägg till följande kod för att konfigurera headern från vilket mellanprogrammet skapar ett certifikat.
- Anropa UseCertificateForwarding innan anropet till UseAuthentication.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddCertificateForwarding(options =>
options.CertificateHeader = "YOUR_CERTIFICATE_HEADER_NAME");
var app = builder.Build();
app.UseCertificateForwarding();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.UseAuthentication();
app.MapRazorPages();
app.Run();
Om proxyn inte base64-kodar certifikatet, vilket är fallet med Nginx, anger du alternativet HeaderConverter
. Tänk på följande exempel:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddCertificateForwarding(options =>
{
options.CertificateHeader = "YOUR_CUSTOM_HEADER_NAME";
options.HeaderConverter = (headerValue) =>
{
// Conversion logic to create an X509Certificate2.
var clientCertificate = ConversionLogic.CreateAnX509Certificate2();
return clientCertificate;
};
});
var app = builder.Build();
app.UseCertificateForwarding();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.UseAuthentication();
app.MapRazorPages();
app.Run();
Felsöka
När huvuden inte vidarebefordras som förväntat aktiverar du loggning på nivå debug
och HTTP-begärandeloggning.
UseHttpLogging måste anropas efter UseForwardedHeaders:
using Microsoft.AspNetCore.HttpLogging;
using Microsoft.AspNetCore.HttpOverrides;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddHttpLogging(options =>
{
options.LoggingFields = HttpLoggingFields.RequestPropertiesAndHeaders;
});
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
var app = builder.Build();
app.UseForwardedHeaders();
app.UseHttpLogging();
app.Use(async (context, next) =>
{
// Connection: RemoteIp
app.Logger.LogInformation("Request RemoteIp: {RemoteIpAddress}",
context.Connection.RemoteIpAddress);
await next(context);
});
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Om det finns flera värden i ett visst huvud bearbetar Vidarebefordrade rubriker Mellanprogram rubriker i omvänd ordning från höger till vänster. Standardvärdet ForwardLimit
är 1
(ett), så endast det högra värdet från rubrikerna bearbetas om inte värdet för ForwardLimit
ökas.
Begärans ursprungliga fjärr-IP måste matcha ett inlägg i KnownProxies- eller KnownNetworks-listorna innan vidarebefordrade rubriker bearbetas. Detta begränsar sidhuvudets förfalskning genom att inte acceptera vidarebefordrare från ej betrodda proxyservrar. När en okänd proxy identifieras anger loggning proxyns adress:
September 20th 2018, 15:49:44.168 Unknown proxy: 10.0.0.100:54321
I föregående exempel är 10.0.0.100 en proxyserver. Om servern är en betrodd proxy lägger du till serverns IP-adress i KnownProxies
eller lägger till ett betrott nätverk i KnownNetworks
. För ytterligare information, se avsnittet Mellanprogram för vidarebefordrade rubriker, alternativ.
using Microsoft.AspNetCore.HttpOverrides;
using System.Net;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseForwardedHeaders();
app.UseHsts();
}
else
{
app.UseDeveloperExceptionPage();
app.UseForwardedHeaders();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Om du vill visa loggarna lägger du till "Microsoft.AspNetCore.HttpLogging": "Information"
i filen appsettings.Development.json
:
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Microsoft.AspNetCore.HttpLogging": "Information"
}
}
}
Viktig
Tillåt endast betrodda proxyservrar och nätverk att vidarebefordra huvuden. Annars är IP-förfalsknings attacker möjliga.
Ytterligare resurser
I den rekommenderade konfigurationen för ASP.NET Core hanteras appen med hjälp av IIS/ASP.NET Core Module, Nginx eller Apache. Proxyservrar, lastbalanserare och andra nätverksinstallationer döljer ofta information om begäran innan den når appen:
- När HTTPS-förfrågningar skickas via HTTP går det ursprungliga schemat (HTTPS) förlorat och måste vidarebefordras i en header.
- Eftersom en app tar emot en begäran från proxyn och inte dess verkliga källa på Internet eller företagsnätverket, måste den ursprungliga klientens IP-adress också vidarebefordras i en header.
Den här informationen kan vara viktig vid bearbetning av begäranden, till exempel vid omdirigeringar, autentisering, länkgenerering, principutvärdering och klientgeolocation.
Vidarebefordrade rubriker
Enligt konventionen vidarebefordrar proxyservrar information i HTTP-huvuden.
Rubrik | Beskrivning |
---|---|
X-Forwarded-For | Innehåller information om klienten som initierade begäran och efterföljande proxyservrar i en kedja med proxyservrar. Den här parametern kan innehålla IP-adresser (och valfritt portnummer). I en kedja med proxyservrar anger den första parametern klienten där begäran först gjordes. Efterföljande proxyidentifierare följer. Den sista proxyn i kedjan finns inte i listan med parametrar. Den senaste proxyns IP-adress, och eventuellt ett portnummer, är tillgängliga som fjärr-IP-adress på transportlagret. |
X-Forwarded-Proto | Värdet för det ursprungliga schemat (HTTP/HTTPS). Värdet kan också vara en lista över scheman om begäran har passerat flera proxyservrar. |
X-Forwarded-Host | Det ursprungliga värdet för fältet Värdhuvud. Vanligtvis ändrar proxyservrar inte värdrubriken. Se Microsoft Security Advisory CVE-2018-0787 för information om en säkerhetsrisk med utökade privilegier som påverkar system där proxyn inte validerar eller begränsar värdhuvuden till kända goda värden. |
Det vidarebefordrade mellanprogrammet för sidhuvuden (ForwardedHeadersMiddleware), läser dessa rubriker och fyller i de associerade fälten på HttpContext.
Mellanprogrammet uppdateras:
-
HttpContext.Connection.RemoteIpAddress: Ange med hjälp av värdet i
X-Forwarded-For
-huvudet. Ytterligare inställningar påverkar hur mellanprogrammet sätterRemoteIpAddress
. Mer information finns i alternativen för mellanprogrammet för vidarebefordrade rubriker . De förbrukade värdena tas bort frånX-Forwarded-For
och de gamla värdena sparas iX-Original-For
. Samma mönster tillämpas på de andra rubrikerna,Host
ochProto
. -
HttpContext.Request.Scheme: Används med
X-Forwarded-Proto
header-värde. -
HttpContext.Request.Host: Ange värdet för
X-Forwarded-Host
-huvudet.
För mer information om det föregående, se ärende på GitHub.
Vidarebefordrade huvudmellanprogram standardinställningar kan konfigureras. För standardinställningarna:
- Det finns bara en proxy mellan appen och källan för begäranden.
- Endast loopback-adresser konfigureras för kända proxyservrar och kända nätverk.
- De vidarebefordrade rubrikerna heter
X-Forwarded-For
ochX-Forwarded-Proto
. - Värdet
ForwardedHeaders
ärForwardedHeaders.None
, och de önskade vidarebefordrarna måste anges här för att aktivera mellanprogrammet.
Alla nätverksenheter lägger inte till X-Forwarded-For
- och X-Forwarded-Proto
-huvuden utan ytterligare konfiguration. Läs installationstillverkarens vägledning om proxied-begäranden inte innehåller dessa rubriker när de når appen. Om installationen använder andra rubriknamn än X-Forwarded-For
och X-Forwarded-Proto
anger du alternativen ForwardedForHeaderName och ForwardedProtoHeaderName så att de matchar huvudnamnen som används av installationen. Mer information finns i Vidarebefordrade header-mellanprogramalternativ och Konfiguration för en proxy som använder olika rubriknamn.
IIS/IIS Express- och ASP.NET Core-modul
Middleware för vidarebefordrade headers är aktiverat som standard av IIS Integration Middleware när appen körs utanför processen bakom IIS och ASP.NET Core Module. Vidarebefordrade huvudmellanprogrammet aktiveras för att köras först i mellanprogramspipelinen med en begränsad konfiguration som är specifik för ASP.NET Core-modulen på grund av säkerhetsproblem med vidarebefordrade huvuden (till exempel IP-förfalskning). Mellanprogrammet är konfigurerat för att vidarebefordra X-Forwarded-For
- och X-Forwarded-Proto
-huvuden och är begränsat till en enda localhost-proxy. Om ytterligare konfiguration krävs kan du läsa alternativen Vidarebefordrade rubriker mellanprogram.
Andra scenarier för proxyserver och lastbalanserare
Om du inte använder IIS-integrering när du är värd för out-of-process-aktiveras inte vidarebefordrade huvudmellanprogram som standard. Vidarebefordrade headers-mellanprogram måste vara aktiverat för att en app ska kunna bearbeta vidarebefordrade headers med UseForwardedHeaders. När du har aktiverat mellanprogrammet om inga ForwardedHeadersOptions har angetts för mellanprogrammet är standardvärdet ForwardedHeadersOptions.ForwardedHeadersForwardedHeaders.None.
Konfigurera mellanprogrammet med ForwardedHeadersOptions för att vidarebefordra X-Forwarded-For
- och X-Forwarded-Proto
-huvudena i Startup.ConfigureServices
.
Mellanprogramsordning för vidarebefordrade rubriker
Vidarebefordrade rubriker Mellanprogram ska köras före andra mellanprogram. Den här ordningen säkerställer att mellanprogrammet som förlitar sig på vidarebefordrad rubrikinformation kan använda huvudvärdena för bearbetning. Vidarebefordrade huvudmellanprogram kan köras efter diagnostik och felhantering, men det måste köras innan UseHsts
anropas:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseForwardedHeaders();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseForwardedHeaders();
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
Du kan också anropa UseForwardedHeaders
före diagnostik:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseForwardedHeaders();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Not
Om inga ForwardedHeadersOptions anges i Startup.ConfigureServices
eller direkt till tilläggsmetoden med UseForwardedHeadersär standardrubrikerna som ska vidarebefordras ForwardedHeaders.None. Egenskapen ForwardedHeaders måste konfigureras med rubrikerna för att vidarebefordra.
Nginx-konfiguration
För att vidarebefordra X-Forwarded-For
- och X-Forwarded-Proto
-huvudena, se Host ASP.NET Core on Linux with Nginx. Mer information finns i NGINX: Användning av den vidarebefordrade rubriken.
Apache-konfiguration
X-Forwarded-For
läggs till automatiskt (se Apache-modulen mod_proxy: Sidhuvuden för omvänd proxyförfrågan).
Alternativ för vidarebefordrade rubriker i middleware
ForwardedHeadersOptions styra beteendet för middleware för vidarebefordrade headers. I följande exempel ändras standardvärdena:
- Begränsa antalet poster i de vidarebefordrade rubrikerna till
2
. - Lägg till en känd proxyadress för
127.0.10.1
. - Ändra namnet på den vidarebefordrade headern från standarden
X-Forwarded-For
tillX-Forwarded-For-My-Custom-Header-Name
.
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardLimit = 2;
options.KnownProxies.Add(IPAddress.Parse("127.0.10.1"));
options.ForwardedForHeaderName = "X-Forwarded-For-My-Custom-Header-Name";
});
Alternativ | Beskrivning |
---|---|
AllowedHosts | Begränsar värdar efter X-Forwarded-Host -huvudet till de värden som anges.
IList<string> . |
ForwardedHeaders | Identifierar vilka vidarebefordrare som ska bearbetas. Se ForwardedHeaders Enum för listan över fält som gäller. Typiska värden som tilldelats den här egenskapen är ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto .Standardvärdet är ForwardedHeaders.None. |
ForwardedForHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XForwardedForHeaderName. Det här alternativet används när proxyn/vidarebefordraren inte använder X-Forwarded-For -huvudet, men använder en annan rubrik för att vidarebefordra informationen.Standardvärdet är X-Forwarded-For . |
ForwardedHostHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XForwardedHostHeaderName. Det här alternativet används när proxyn/vidarebefordraren inte använder X-Forwarded-Host -huvudet, men använder en annan rubrik för att vidarebefordra informationen.Standardvärdet är X-Forwarded-Host . |
ForwardedProtoHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XForwardedProtoHeaderName. Det här alternativet används när proxyn/vidarebefordraren inte använder X-Forwarded-Proto -huvudet, men använder en annan rubrik för att vidarebefordra informationen.Standardvärdet är X-Forwarded-Proto . |
ForwardedPrefixHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XForwardedPrefixHeaderName. Det här alternativet används när proxyn/vidarebefordraren inte använder X-Forwarded-Prefix -huvudet, men använder en annan rubrik för att vidarebefordra informationen.Standardvärdet är X-Forwarded-Prefix . |
ForwardLimit | Begränsar antalet poster i rubrikerna som bearbetas. Ange till null för att inaktivera gränsen, men detta bör endast göras om KnownProxies eller KnownNetworks har konfigurerats. Att ange ett icke-null värde är en försiktighetsåtgärd (men inte en garanti) för att skydda mot felkonfigurerade proxyservrar och skadliga begäranden som kommer från sidokanaler i nätverket.Vidarebefordrade rubriker Mellanprogram bearbetar rubriker i omvänd ordning från höger till vänster. Om standardvärdet ( 1 ) används bearbetas endast det högra värdet från rubrikerna om inte värdet för ForwardLimit ökas.Standardvärdet är 1 . |
KnownNetworks | Adressintervall för kända nätverk som du kan acceptera vidarebefordrade huvuden från. Ange IP-intervall med CIDR-notation (Classless Interdomain Routing). Om servern använder socketar med dubbla lägen anges IPv4-adresser i IPv6-format (till exempel 10.0.0.1 i IPv4 som representeras i IPv6 som ::ffff:10.0.0.1 ). Se IPAddress.MapToIPv6. Kontrollera om det här formatet krävs genom att titta på HttpContext.Connection.RemoteIpAddress.Standardvärdet är en IList <IPNetwork> som innehåller en enda post för new IPNetwork(IPAddress.Loopback, 8) . |
KnownProxies | Adresser till kända proxyservrar som du kan acceptera vidarebefordrade huvuden från. Använd KnownProxies för att ange exakta IP-adressmatchningar.Om servern använder socketar med dubbla lägen anges IPv4-adresser i IPv6-format (till exempel 10.0.0.1 i IPv4 som representeras i IPv6 som ::ffff:10.0.0.1 ). Se IPAddress.MapToIPv6. Kontrollera om det här formatet krävs genom att titta på HttpContext.Connection.RemoteIpAddress.Standardvärdet är en IList <IPAddress> som innehåller en enda inmatning för IPAddress.IPv6Loopback . |
OriginalForHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XOriginalForHeaderName. Standardvärdet är X-Original-For . |
OriginalHostHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XOriginalHostHeaderName. Standardvärdet är X-Original-Host . |
OriginalProtoHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XOriginalProtoHeaderName. Standardvärdet är X-Original-Proto . |
OriginalPrefixHeaderName | Använd rubriken som anges av den här egenskapen i stället för den som anges av ForwardedHeadersDefaults.XOriginalPrefixHeaderName. Standardvärdet är X-Original-Prefix . |
RequireHeaderSymmetry | Kräv att antalet rubrikvärden är synkroniserade mellan de rubriker som behandlas av ForwardedHeadersOptions.ForwardedHeaders. Standardvärdet i ASP.NET Core 1.x är true . Standardvärdet i ASP.NET Core 2.0 eller senare är false . |
Scenarier och användningsfall
När det inte går att lägga till vidarebefordrade headers och alla förfrågningar är säkra
I vissa fall kanske det inte går att lägga till vidarebefordrade huvuden till de begäranden som skickas till appen. Om proxyn framtvingar att alla offentliga externa begäranden är HTTPS kan schemat anges manuellt i Startup.Configure
innan du använder någon typ av mellanprogram:
app.Use((context, next) =>
{
context.Request.Scheme = "https";
return next();
});
Den här koden kan inaktiveras med en miljövariabel eller annan konfigurationsinställning i en utvecklings- eller mellanlagringsmiljö.
Hantera sökvägsbas och proxyservrar som ändrar sökvägen för begäran
Vissa proxyservrar skickar sökvägen intakt men med en appbassökväg som ska tas bort så att routningen fungerar korrekt. UsePathBaseExtensions.UsePathBase mellanprogram delar upp sökvägen i HttpRequest.Path och appens bassökväg i HttpRequest.PathBase.
Om /foo
är appbassökvägen för en proxysökväg som skickas som /foo/api/1
anger mellanprogrammet Request.PathBase
till /foo
och Request.Path
till /api/1
med följande kommando:
app.UsePathBase("/foo");
Den ursprungliga sökvägen och sökvägsbasen tillämpas igen när mellanprogrammet anropas igen i omvänd ordning. Mer information om orderbearbetning av mellanprogram finns i ASP.NET Core Middleware.
Om proxyn trimmar sökvägen (till exempel vidarebefordran /foo/api/1
till /api/1
) korrigerar du omdirigeringar och länkar genom att ange begärans PathBase-egenskap:
app.Use((context, next) =>
{
context.Request.PathBase = new PathString("/foo");
return next();
});
Om proxyn lägger till sökvägsdata tar du bort en del av sökvägen för att åtgärda omdirigeringar och länkar med hjälp av StartsWithSegments och tilldela till egenskapen Path:
app.Use((context, next) =>
{
if (context.Request.Path.StartsWithSegments("/foo", out var remainder))
{
context.Request.Path = remainder;
}
return next();
});
Konfiguration för en proxy som använder olika rubriknamn
Om proxyn inte använder rubriker med namnet X-Forwarded-For
och X-Forwarded-Proto
för att vidarebefordra proxyadressen/porten och ursprunglig schemainformation anger du alternativen ForwardedForHeaderName och ForwardedProtoHeaderName för att matcha huvudnamnen som används av proxyn:
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedForHeaderName = "Header_Name_Used_By_Proxy_For_X-Forwarded-For_Header";
options.ForwardedProtoHeaderName = "Header_Name_Used_By_Proxy_For_X-Forwarded-Proto_Header";
});
Vidarebefordra schemat för omvända proxyservrar för Linux och icke-IIS
Appar som anropar UseHttpsRedirection och UseHsts sätter en webbplats i en oändlig loop om de distribueras till en Azure Linux App Service, en virtuell Azure Linux-dator (VM) eller bakom någon annan omvänd proxy förutom IIS. TLS avslutas av den omvända proxyn, och Kestrel informeras inte om rätt begäranschema. OAuth och OIDC misslyckas också i den här konfigurationen eftersom de genererar felaktiga omdirigeringar. UseIISIntegration lägger till och konfigurerar vidarebefordrade huvudmellanprogram när de körs bakom IIS, men det finns ingen matchande automatisk konfiguration för Linux (Apache- eller Nginx-integrering).
För att vidarebefordra schemat från proxyn i icke-IIS-scenarier, lägg till och konfigurera funktionen för vidarebefordrade rubriker. I Startup.ConfigureServices
använder du följande kod:
// using Microsoft.AspNetCore.HttpOverrides;
if (string.Equals(
Environment.GetEnvironmentVariable("ASPNETCORE_FORWARDEDHEADERS_ENABLED"),
"true", StringComparison.OrdinalIgnoreCase))
{
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto;
// Only loopback proxies are allowed by default.
// Clear that restriction because forwarders are enabled by explicit
// configuration.
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
}
Vidarebefordring av certifikat
Blått
Information om hur du konfigurerar Azure App Service för vidarebefordring av certifikat finns i Konfigurera ömsesidig TLS-autentisering för Azure App Service. Följande vägledning gäller för att konfigurera ASP.NET Core-appen.
I Startup.Configure
lägger du till följande kod före anropet till app.UseAuthentication();
:
app.UseCertificateForwarding();
Konfigurera Mellanprogram för vidarebefordran av certifikat för att ange det rubriknamn som Azure använder. I Startup.ConfigureServices
lägger du till följande kod för att konfigurera rubriken från vilken mellanprogrammet skapar ett certifikat:
services.AddCertificateForwarding(options =>
options.CertificateHeader = "X-ARR-ClientCert");
Andra webbproxyservrar
Om en proxy används som inte är IIS eller Azure App Service's Application Request Routing (ARR) konfigurerar du proxyn för att vidarebefordra certifikatet som den tog emot i ett HTTP-huvud. I Startup.Configure
lägger du till följande kod före anropet till app.UseAuthentication();
:
app.UseCertificateForwarding();
Konfigurera mellanprogrammet för vidarebefordran av certifikat för att ange rubriknamnet. I Startup.ConfigureServices
lägger du till följande kod för att konfigurera rubriken från vilken mellanprogrammet skapar ett certifikat:
services.AddCertificateForwarding(options =>
options.CertificateHeader = "YOUR_CERTIFICATE_HEADER_NAME");
Om proxyn inte base64-kodar certifikatet (vilket är fallet med Nginx) anger du alternativet HeaderConverter
. Överväg följande exempel i Startup.ConfigureServices
:
services.AddCertificateForwarding(options =>
{
options.CertificateHeader = "YOUR_CUSTOM_HEADER_NAME";
options.HeaderConverter = (headerValue) =>
{
var clientCertificate =
/* some conversion logic to create an X509Certificate2 */
return clientCertificate;
}
});
Felsöka
När rubriker inte vidarebefordras som förväntat aktiverar du loggning. Om loggarna inte innehåller tillräckligt med information för att felsöka problemet räknar du upp de begärandehuvuden som tas emot av servern. Använd infogade mellanprogram för att skriva begärandehuvuden till ett appsvar eller logga rubrikerna.
Om du vill skriva rubrikerna till appens svar placerar du följande terminalinterna mellanprogram omedelbart efter anropet till UseForwardedHeaders i Startup.Configure
:
app.Run(async (context) =>
{
context.Response.ContentType = "text/plain";
// Request method, scheme, and path
await context.Response.WriteAsync(
$"Request Method: {context.Request.Method}{Environment.NewLine}");
await context.Response.WriteAsync(
$"Request Scheme: {context.Request.Scheme}{Environment.NewLine}");
await context.Response.WriteAsync(
$"Request Path: {context.Request.Path}{Environment.NewLine}");
// Headers
await context.Response.WriteAsync($"Request Headers:{Environment.NewLine}");
foreach (var header in context.Request.Headers)
{
await context.Response.WriteAsync($"{header.Key}: " +
$"{header.Value}{Environment.NewLine}");
}
await context.Response.WriteAsync(Environment.NewLine);
// Connection: RemoteIp
await context.Response.WriteAsync(
$"Request RemoteIp: {context.Connection.RemoteIpAddress}");
});
Du kan skriva till loggfilen i stället för svarstexten. Genom att skriva till loggar kan webbplatsen fungera normalt vid felsökning.
Så här skriver du loggar i stället för till svarstexten:
- Mata in
ILogger<Startup>
i klassenStartup
enligt beskrivningen i Skapa loggar i Start. - Placera följande infogade mellanprogram direkt efter anropet till UseForwardedHeaders i
Startup.Configure
.
app.Use(async (context, next) =>
{
// Request method, scheme, path, and base path
_logger.LogDebug("Request Method: {Method}", context.Request.Method);
_logger.LogDebug("Request Scheme: {Scheme}", context.Request.Scheme);
_logger.LogDebug("Request Path: {Path}", context.Request.Path);
_logger.LogDebug("Request Path Base: {PathBase}", context.Request.PathBase);
// Headers
foreach (var header in context.Request.Headers)
{
_logger.LogDebug("Header: {Key}: {Value}", header.Key, header.Value);
}
// Connection: RemoteIp
_logger.LogDebug("Request RemoteIp: {RemoteIpAddress}",
context.Connection.RemoteIpAddress);
await next();
});
När de bearbetas flyttas X-Forwarded-{For|Proto|Host|Prefix}
värden till X-Original-{For|Proto|Host|Prefix}
. Om det finns flera värden i ett visst huvud bearbetar Vidarebefordrade rubriker Mellanprogram rubriker i omvänd ordning från höger till vänster. Standardvärdet ForwardLimit
är 1
(ett), så endast det högra värdet från rubrikerna bearbetas om inte värdet för ForwardLimit
ökas.
Begärans ursprungliga fjärr-IP måste matcha en post i KnownProxies
- eller KnownNetworks
-listorna innan vidarebefordrade huvuden bearbetas. Detta begränsar sidhuvudets förfalskning genom att inte acceptera vidarebefordrare från ej betrodda proxyservrar. När en okänd proxy identifieras anger loggning proxyns adress:
September 20th 2018, 15:49:44.168 Unknown proxy: 10.0.0.100:54321
I föregående exempel är 10.0.0.100 en proxyserver. Om servern är en betrodd proxy lägger du till serverns IP-adress i KnownProxies
(eller lägger till ett betrott nätverk i KnownNetworks
) i Startup.ConfigureServices
. Mer information finns i avsnittet Alternativ för mellanprogrammet för vidarebefordrade headers.
services.Configure<ForwardedHeadersOptions>(options =>
{
options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});
Viktig
Tillåt endast betrodda proxyservrar och nätverk att vidarebefordra huvuden. Annars är attacker med IP-förfalskning möjliga.
Ytterligare resurser
ASP.NET Core