Dela via


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:

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 och X-Forwarded-Prefix.
  • Värdet ForwardedHeaders är ForwardedHeaders.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-Protoanger 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 till X-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.
  • Värden jämförs med ordningstal-ignorera-skiftläge.
  • Portnummer måste undantas.
  • Om listan är tom, tillåts alla värdar.
  • Ett jokertecken på toppnivå * tillåter alla värdar som inte är tomma.
  • Jokertecken för underdomäner tillåts men matchar inte rotdomänen. Till exempel matchar *.contoso.com underdomänen foo.contoso.com men inte rotdomänen contoso.com.
  • Unicode-värdnamn tillåts men konverteras till Punycode- för matchning.
  • IPv6-adresser måste innehålla avgränsningsparenteser och vara i konventionell form (till exempel [ABCD:EF01:2345:6789:ABCD:EF01:2345:6789]). IPv6-adresser särbehandlas inte för att verifiera logisk likvärdighet mellan olika format och ingen kanonisering utförs.
  • Om det inte går att begränsa tillåtna värdar kan en cyberattacker tillåta förfalskning av länkar som genereras av tjänsten.
Standardvärdet är ett tomt 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/1anger 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.

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.

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å debugoch 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 KnownProxieseller 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ätter RemoteIpAddress. Mer information finns i alternativen för mellanprogrammet för vidarebefordrade rubriker . De förbrukade värdena tas bort från X-Forwarded-Foroch de gamla värdena sparas i X-Original-For. Samma mönster tillämpas på de andra rubrikerna, Host och Proto.
  • 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 och X-Forwarded-Proto.
  • Värdet ForwardedHeaders är ForwardedHeaders.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-Protoanger 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 UseHstsanropas:

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 till X-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.
  • Värden jämförs med ordningstal-ignorera-skiftläge.
  • Portnummer måste undantas.
  • Om listan är tom tillåts alla värdar.
  • Ett jokertecken på toppnivå * tillåter alla värdar som inte är tomma.
  • Jokertecken för underdomäner tillåts men matchar inte rotdomänen. Till exempel matchar *.contoso.com underdomänen foo.contoso.com men inte rotdomänen contoso.com.
  • Unicode-värdnamn tillåts men konverteras till Punycode- för matchning.
  • IPv6-adresser måste innehålla avgränsningsparenteser och vara i konventionell form (till exempel [ABCD:EF01:2345:6789:ABCD:EF01:2345:6789]). IPv6-adresser behandlas inte som specialfall för att kontrollera logisk likhet mellan olika format och ingen kanonisering utförs.
  • Om det inte går att begränsa tillåtna värdar kan en cyberattacker tillåta förfalskning av länkar som genereras av tjänsten.
Standardvärdet är ett tomt 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/1anger 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.ConfigureServicesanvä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.Configurelä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.ConfigureServiceslä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.Configurelä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.ConfigureServiceslä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 klassen Startup 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