Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma
ChrisRis tarafından
ASP.NET Core için önerilen yapılandırmada uygulama IIS/ASP.NET Core Module, Nginx veya Apache kullanılarak barındırıldı. Ara sunucular, yük dengeciler ve diğer ağ gereçleri genellikle uygulamaya ulaşmadan önce istekle ilgili bilgileri karartmaktadır:
- HTTP üzerinden HTTPS isteklerine sunucu bağlantısı olduğunda, özgün düzen (HTTPS) kaybolur ve bir üst bilgide ilet gerekir.
- Bir uygulama, İnternet'te veya kurumsal ağ üzerinde gerçek kaynağından değil ara sunucudan bir istek aldığından, kaynak istemci IP adresi de bir üst bilgide ilet gerekir.
Bu bilgiler yeniden yönlendirmeler, kimlik doğrulaması, bağlantı oluşturma, ilke değerlendirmesi ve istemci coğrafi konumu gibi istek işlemede önemli olabilir.
Iletili üst bilgiler
Kural gereği, sunucular BILGILERI HTTP üst bilgisinde iletir.
| Üst bilgi | Description |
|---|---|
| X-Forwarded-for | İsteği başlatan istemci ve sonraki yan sunuculara ilişkin bilgileri bir sunucu zincirinde tutar. Bu parametre IP adresleri (ve isteğe bağlı olarak bağlantı noktası numaraları) içerebilir. Bir ara sunucu zincirinde, ilk parametre isteğin ilk bulunduğu istemciyi belirtir. Sonraki ara sunucu tanımlayıcıları aşağıdaki gibi olur. Zincirde son ara sunucu parametre listesinde yer alıyor. Son proxy'nin IP adresi ve isteğe bağlı olarak bir bağlantı noktası numarası, aktarım katmanında uzak IP adresi olarak kullanılabilir. |
| X-Forwarded-Proto | Kaynak düzenin değeri (HTTP/HTTPS). İstek birden çok diziden geçse de değer bir şema listesi olabilir. |
| X-Forwarded-Host | Konak üst bilgisi alanı özgün değeri. Genellikle, sunucularda Konak üst bilgisi değiştirmez. Proxy'nin Konak üst bilgilerini doğrulamaması veya bilinen iyi değerlerle kısıtlamaması gibi sistemleri etkileyen ayrıcalık yükseltme güvenlik açığı hakkında bilgi için bkz. Microsoft Güvenlik Danışmanlığı CVE-2018-0787. |
Iletili Üst Bilgiler Ara Yazılımı ( ForwardedHeadersMiddleware ), bu üst bilgileri okur ve üzerinde ilişkili alanları HttpContext doldurur.
Ara yazılım güncelleştirmeleri:
- HttpContext.Connection.RemoteIpAddress:Üst bilgi değeri
X-Forwarded-Forkullanılarak ayarlanır. Ek ayarlar, ara yazılımların nasıl ayara sahip olduğunuRemoteIpAddressetkiler. Ayrıntılar için bkz. Iletili Üst Bilgiler Ara Yazılımı seçenekleri. - HttpContext.Request.Scheme:Üst bilgi değeri
X-Forwarded-Protokullanılarak ayarlanır. - HttpContext.Request.Host:Üst bilgi değeri
X-Forwarded-Hostkullanılarak ayarlanır.
Öncekiyle ilgili daha fazla bilgi için bu soruna GitHub bakın.
Iletili Üst Bilgiler Ara Yazılım varsayılan ayarları yalıtabilirsiniz. Varsayılan ayarlar için:
- Uygulama ile isteklerin kaynağı arasında yalnızca bir ara sunucu vardır.
- Bilinen ve bilinen ağlar için yalnızca geri döngü adresleri yapılandırılır.
- Iletirken üst bilgiler ve olarak
X-Forwarded-ForX-Forwarded-Protoadlandırılmıştır. ForwardedHeadersdeğeridir, ara yazılımı etkinleştirmek için istenenForwardedHeaders.Noneileticilerin burada ayarlanmış olması gerekir.
Tüm ağ gereçleri ve üst X-Forwarded-For bilgilerini ek yapılandırma olmadan X-Forwarded-Proto eklemez. Uygulamaya ulaşan proxied istekleri bu üst bilgileri içermezse alet üreticinizin kılavuzuna başvurun. Gereç ve'den farklı üst bilgi adları X-Forwarded-For X-Forwarded-Proto kullanıyorsa ve ForwardedForHeaderName seçeneklerini alet tarafından kullanılan üst bilgi ForwardedProtoHeaderName adlarla eş olacak şekilde ayarlayın. Daha fazla bilgi için bkz. Farklı üst bilgi adları kullanan bir ara sunucu için Iletili Üst Bilgiler Ara Yazılımı seçenekleri ve Yapılandırma.
IIS/IIS Express ve ASP.NET Core Modülü
Uygulama IIS'nin ve ASP.NET Core Modülünün arkasında işlem dışı barındırıldıklarında, iletili Üst Bilgiler Ara Yazılımı IIS Tümleştirme Ara Yazılımı tarafından varsayılan olarak etkindir. Iletili Üst Bilgiler Ara Yazılımı, iletili üst bilgilerle ilgili güven endişeleri (örneğin, IP spoofing)nedeniyle ASP.NET Core Modülü'ne özgü kısıtlı bir yapılandırmayla ara yazılım işlem hattında ilk olarak çalıştırmak için etkinleştirilir. Ara yazılım ve üst bilgilerini ilet üzere yapılandırılır ve X-Forwarded-For X-Forwarded-Proto tek bir localhost proxy'si ile sınırlıdır. Ek yapılandırma gerekirse, bkz. Iletili Üst Bilgiler Ara Yazılımı seçenekleri.
Diğer ara sunucu ve yük dengeleyici senaryoları
İşlem dışı barındırıyorsanız IIS Tümleştirmesi'nikullanmanın dışında, Iletili Üst Bilgiler Ara Yazılımı varsayılan olarak etkin değildir. Bir uygulamanın ile iletili üst bilgileri işlemesi için Iletili Üst Bilgiler Ara Yazılımı UseForwardedHeaders etkinleştirilmelidir. Ara yazılım için belirtilmezse ara yazılımı etkinleştirdikten sonra, varsayılan ForwardedHeadersOptions ForwardedHeadersOptions.ForwardedHeaders, ForwardedHeaders.None olur.
içinde ve üst bilgilerini ForwardedHeadersOptions ilet için ara yazılımı ile X-Forwarded-For X-Forwarded-Proto Startup.ConfigureServices yapılandırın.
Iletili Üst Bilgiler Ara Yazılımı sırası
Iletili Üst Bilgiler Ara Yazılımı, diğer ara yazılımlardan önce çalışmalı. Bu sıralama, iletili üst bilgilere bağlı olan ara yazılımların işleme için üst bilgi değerlerini tüketmelerini sağlar. Iletili Üst Bilgiler Ara Yazılımı tanılama ve hata işlemeden sonra çalışmasına neden olabilir, ancak çağrılmadan önce çalıştırıldı olması UseHsts gerekir:
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?}");
});
}
}
Alternatif olarak, UseForwardedHeaders tanılamadan önce çağrısı:
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
ile uzantı yönteminde veya doğrudan içinde belirtilmezse, iletilen varsayılan üst bilgiler ForwardedHeadersOptions Startup.ConfigureServices UseForwardedHeaders ForwardedHeaders.None'tir. ForwardedHeadersÖzelliğin ilet için üst bilgilerle yapılandırılması gerekir.
Nginx yapılandırması
ve üst X-Forwarded-For bilgilerini ilet için X-Forwarded-Proto bkz. ngınx ile Linux üzerinde ana bilgisayar ASP.NET Core . Daha fazla bilgi için bkz. NGINX: Iletilen üst bilgisini kullanma.
Apache yapılandırması
X-Forwarded-For otomatik olarak eklenir (bkz. Apache Module mod_proxy: Ters Ara Sunucu İsteği Üst Bilgileri). Üst bilgiyi iletme hakkında bilgi için X-Forwarded-Proto bkz. Apache ile Linux üzerinde ASP.NET Core barındırma .
Iletili Üst Bilgiler Ara Yazılımı seçenekleri
ForwardedHeadersOptions Iletili Üst Bilgiler Ara Yazılımı'nın davranışını denetleme. Aşağıdaki örnek varsayılan değerleri değiştirir:
- Iletirilen üst bilgilerde girdi sayısını ile
2sınırla. - bilinen bir proxy adresi
127.0.10.1ekleyin. - Ileten üst bilgi adını varsayılandan olarak
X-Forwarded-ForX-Forwarded-For-My-Custom-Header-Namedeğiştirebilirsiniz.
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";
});
| Seçenek | Açıklama |
|---|---|
| AllowedHosts | Ana bilgisayarları üst bilgiyle X-Forwarded-Host sağlanan değerlerle kısıtlar.
IList<string> boştur. |
| ForwardedForHeaderName | ForwardedHeadersDefaults.XForwardedForHeaderNametarafından belirtilen yerine bu özellik tarafından belirtilen üst bilgisi kullanın. Bu seçenek, ara sunucu/iletici üst bilgiyi kullanmaz ancak bilgileri ileten başka X-Forwarded-For bir üst bilgi kullandığında kullanılır.Varsayılan değer: X-Forwarded-For. |
| ForwardedHeaders | Hangi ileticilerin işlenmesi gerektiğini tanımlar. Geçerli alanların listesi için bkz. ForwardedHeaders Enum. Bu özelle atanan tipik değerler ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto değerleridir.Varsayılan değer ForwardedHeaders.None değeridir. |
| ForwardedHostHeaderName | ForwardedHeadersDefaults.XForwardedHostHeaderNametarafından belirtilen yerine bu özellik tarafından belirtilen üst bilgisi kullanın. Bu seçenek, ara sunucu/iletici üst bilgiyi kullanmaz ancak bilgileri ileten başka X-Forwarded-Host bir üst bilgi kullandığında kullanılır.Varsayılan değer: X-Forwarded-Host. |
| ForwardedProtoHeaderName | ForwardedHeadersDefaults.XForwardedProtoHeaderNametarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgi kullanın. Bu seçenek, ara sunucu/iletici üst bilgiyi kullanmaz ancak bilgileri ileten başka X-Forwarded-Proto bir üst bilgi kullandığında kullanılır.Varsayılan değer: X-Forwarded-Proto. |
| ForwardLimit | İşlenen üst bilgilerde girdi sayısını sınırlar. Sınırı devre dışı bırakmak için olarak null ayarlayın, ancak bu yalnızca KnownProxies yapılandırılmışsa KnownNetworks veya yapılandırılmışsa yapılması gerekir. Değer olmayan bir ayar yapmak, yanlış yapılandırılmış aracılara ve ağ üzerinde yan kanallardan gelen kötü amaçlı isteklere karşı korumayı garanti null etmektir (ancak garanti edilemez).İleriye Doğru Üst Bilgiler Ara Yazılımı, sağdan sola doğru üst bilgileri ters sırada işleme. Varsayılan değer ( 1 ) kullanılırsa, değeri artırılmış değilse yalnızca üst bilgilerden en sağdaki ForwardLimit değer işlenir.Varsayılan değer: 1. |
| KnownNetworks | Iletili üst bilgileri kabul etmek için bilinen ağların adres aralıkları. Sınıfsız Etki Alanları Arası Yönlendirme (CIDR) notasyonu kullanarak IP aralıkları sağlama. Sunucu çift mod yuvaları kullanıyorsa, IPv4 adresleri bir IPv6 biçiminde sağlanır (örneğin, olarak IPv6 ile temsil edilen 10.0.0.1 IPv4 ::ffff:10.0.0.1 içinde). Bkz. IPAddress.MapToIPv6. HttpContext.Connection.RemoteIpAddress'ebakarak bu biçimin gerekli olup olmadığını belirler.Varsayılan, için IList <IPNetwork tek> içeren bir IPAddress.Loopback uygulamadır. |
| KnownProxies | Iletili üst bilgileri kabul etmek için bilinen yanların adresleri. Tam KnownProxies IP adresi eşleşmelerini belirtmek için kullanın.Sunucu çift mod yuvaları kullanıyorsa, IPv4 adresleri bir IPv6 biçiminde sağlanır (örneğin, olarak IPv6 ile temsil edilen 10.0.0.1 IPv4 ::ffff:10.0.0.1 içinde). Bkz. IPAddress.MapToIPv6. HttpContext.Connection.RemoteIpAddress'ebakarak bu biçimin gerekli olup olmadığını belirler.Varsayılan, için IList <IPAddress tek> içeren bir IPAddress.IPv6Loopback uygulamadır. |
| OriginalForHeaderName | ForwardedHeadersDefaults.XOriginalForHeaderNametarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgisi kullanın. Varsayılan değer: X-Original-For. |
| OriginalHostHeaderName | ForwardedHeadersDefaults.XOriginalHostHeaderNametarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgi kullanın. Varsayılan değer: X-Original-Host. |
| OriginalProtoHeaderName | ForwardedHeadersDefaults.XOriginalProtoHeaderNametarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgisi kullanın. Varsayılan değer: X-Original-Proto. |
| RequireHeaderSymmetry | İşlenen ForwardedHeadersOptions.ForwardedHeaders arasında eşitlenecek üst bilgi değerlerinin sayısını gerektirir. 1.x ASP.NET Core varsayılan true değerdir. 2.0 veya ASP.NET Core varsayılan false değerdir. |
Senaryolar ve kullanım örnekleri
Iletilen üst bilgiler eklenenin ve tüm istekler güvenli olduğunda
Bazı durumlarda uygulamaya iletilen isteklere iletili üst bilgiler eklemek mümkün olmayacaktır. Ara sunucu tüm genel dış isteklerin HTTPS olduğunu zorlarsa, şema herhangi bir ara yazılım türü olmadan Startup.Configure önce el ile ayarlanabilir:
app.Use((context, next) =>
{
context.Request.Scheme = "https";
return next();
});
Bu kod bir ortam değişkeniyle veya geliştirme ya da hazırlama ortamındaki başka bir yapılandırma ayarıyla devre dışı bırakılabilir.
İstek yolunu değiştiren yol tabanı ve yan tüm ekleriyle ilgilenin
Bazı sunucular yolu olduğu gibi ancak yönlendirmenin düzgün çalışması için kaldırılması gereken bir uygulama temel yolu ile birlikte geçer. UsePathBaseExtensions.UsePathBase ara yazılımı yolu HttpRequest.Path'e ve uygulama temel yolunu HttpRequest.PathBase'e böler.
, olarak geçirilen bir ara sunucu yolunun uygulama temel yolu ise, ara yazılım aşağıdaki komutla /foo /foo/api/1 ve olarak Request.PathBase /foo Request.Path /api/1 ayarlar:
app.UsePathBase("/foo");
Ara yazılım ters olarak yeniden çağrıldında özgün yol ve yol tabanı yeniden kullanılıyor. Ara yazılım siparişi işleme hakkında daha fazla bilgi için bkz. ASP.NET Core Middleware .
Ara sunucu yolu kırpıyorsa (örneğin, iletir), isteğin PathBase özelliğini ayarerek yeniden /foo/api/1 /api/1 yönlendirmeleri ve bağlantıları düzeltin:
app.Use((context, next) =>
{
context.Request.PathBase = new PathString("/foo");
return next();
});
Ara sunucu yol verileri ekliyorsa, kullanarak ve özelliğine ataarak yeniden yönlendirmeleri ve bağlantıları düzeltmek StartsWithSegments için yolun bir kısmını Path atın:
app.Use((context, next) =>
{
if (context.Request.Path.StartsWithSegments("/foo", out var remainder))
{
context.Request.Path = remainder;
}
return next();
});
Farklı üst bilgi adları kullanan bir ara sunucu için yapılandırma
Ara sunucu, proxy adresi/bağlantı noktası ve kaynak düzen bilgilerini iletecek şekilde ve adlı üst bilgileri kullanmazsa, ve seçeneklerini ara sunucu tarafından kullanılan üst bilgi adlarla X-Forwarded-For X-Forwarded-Proto eş olacak şekilde ForwardedForHeaderName ForwardedProtoHeaderName ayarlayın:
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";
});
Linux ve IIS olmayan ters sunuculara şemayı iletme
Bir Azure Linux sanal makinesine, Azure App Service Linux sanal makinesine UseHttpsRedirection (VM) veya IIS'den başka bir ters ara sunucuya dağıtılmışsa, bir siteyi çağıran ve sonsuz döngüye alan UseHsts uygulamalar. TLS, ters ara sunucu tarafından sonlandırılır Kestrel ve doğru istek şemasını dikkate alınmaz. Yanlış yeniden yönlendirmeler oluşturması nedeniyle OAuth ve OIDC de bu yapılandırmada başarısız olur. UseIISIntegration IIS arkasında çalıştırıldığında, Iletili Üst Bilgiler Ara Yazılımı ekler ve yapılandırr, ancak Linux için eşleşen otomatik yapılandırma yoktur (Apache veya Nginx tümleştirmesi).
IIS olmayan senaryolarda proxy'den şemayı iletme için, Iletili Üst Bilgiler Ara Yazılımı'nı ekleyin ve yapılandırın. içinde Startup.ConfigureServices aşağıdaki kodu kullanın:
// 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();
});
}
Sertifika iletme
Azure
Sertifika iletme Azure App Service yapılandırmak için bkz. TlS karşılıklı kimlik doğrulamasını Azure App Service. Aşağıdaki kılavuz, uygulamanın yapılandırılması ASP.NET Core içerir.
içinde Startup.Configure çağrısının öncesinde aşağıdaki kodu app.UseAuthentication(); ekleyin:
app.UseCertificateForwarding();
Azure'ın kullandığı üst bilgi adını belirtmek için Sertifika Iletme Ara Yazılımı'nın yapılandırılması. içinde, Startup.ConfigureServices ara yazılım tarafından sertifikanın derlemesi için üst bilgi yapılandırmak üzere aşağıdaki kodu ekleyin:
services.AddCertificateForwarding(options =>
options.CertificateHeader = "X-ARR-ClientCert");
Diğer web tarayıcıları
IIS veya uygulamanın Uygulama İsteği Yönlendirmesi (ARR Azure App Service olmayan bir ara sunucu kullanılıyorsa, proxy'yi http üst bilgisinde aldığı sertifikayı ilet üzere yapılandırın. içinde Startup.Configure çağrısının öncesinde aşağıdaki kodu app.UseAuthentication(); ekleyin:
app.UseCertificateForwarding();
Üst bilgi adını belirtmek için Sertifika Iletme Ara Yazılımı'nın yapılandırılması. içinde, Startup.ConfigureServices ara yazılım tarafından sertifikanın derlemesi için üst bilgi yapılandırmak üzere aşağıdaki kodu ekleyin:
services.AddCertificateForwarding(options =>
options.CertificateHeader = "YOUR_CERTIFICATE_HEADER_NAME");
Ara sunucu sertifikayı base64 kodlamazsa (Nginx'te olduğu gibi) seçeneğini HeaderConverter ayarlayın. içinde aşağıdaki örneği Startup.ConfigureServices düşünün:
services.AddCertificateForwarding(options =>
{
options.CertificateHeader = "YOUR_CUSTOM_HEADER_NAME";
options.HeaderConverter = (headerValue) =>
{
var clientCertificate =
/* some conversion logic to create an X509Certificate2 */
return clientCertificate;
}
});
Sorun giderme
Üst bilgiler beklendiği gibi iletilene kadar günlüğe kaydetmeyi etkinleştirin. Günlükler sorunu gidermek için yeterli bilgi sağlanmıyorsa, sunucu tarafından alınan istek üst bilgilerini numaralara alın. Uygulama yanıtına istek üst bilgileri yazmak veya üst bilgileri günlüğe yazmak için satır içi ara yazılımı kullanın.
Uygulamanın yanıtına üst bilgileri yazmak için, içinde çağrısından hemen sonra aşağıdaki terminali satır içi ara UseForwardedHeaders yazılıma Startup.Configure girin:
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}");
});
Yanıt gövdesi yerine günlüklere yazabilir. Günlüklere yazmak, hata ayıklama sırasında sitenin normal çalışmasını sağlar.
Günlükleri yanıt gövdesi yerine yazmak için:
ILogger<Startup>Başlangıç'ta günlük oluşturma konusunda açıklandığı gibiStartupsınıfına ekleme.- aşağıdaki satır içi ara yazılımı içinde çağrısının hemen UseForwardedHeaders sonrasını
Startup.Configureyapın.
app.Use(async (context, next) =>
{
// Request method, scheme, and 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);
// 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();
});
İşlendiğinde, X-Forwarded-{For|Proto|Host} değerler'e X-Original-{For|Proto|Host} taşınır. Bir üst bilgide birden çok değer varsa, Iletili Üst Bilgiler Ara Yazılımı üst bilgileri sağdan sola doğru ters sırada işlemeye devam eder. Varsayılan değer ForwardLimit (bir) olduğu için, değeri artırılmış değilse üst bilgilerden 1 yalnızca en sağdaki değer ForwardLimit işlenir.
İsteğin özgün uzak IP'sini, iletilen üst bilgiler işlenmeden önce veya KnownProxies KnownNetworks listelerinde bir girdiyle eşleşmesi gerekir. Bu, güvenilmeyen yanlılardan ileticileri kabul etmeerek üst bilgi kimliklerini sınırlar. Bilinmeyen bir ara sunucu algılandığında günlük kaydı proxy'nin adresini gösterir:
September 20th 2018, 15:49:44.168 Unknown proxy: 10.0.0.100:54321
Yukarıdaki örnekte, 10.0.0.100 bir ara sunucudur. Sunucu güvenilir bir ara sunucu ise, içinde sunucusunun IP adresini KnownProxies adresine ekleyin (veya adresine güvenilir bir KnownNetworks ağ Startup.ConfigureServices ekleyin). Daha fazla bilgi için, Iletili Üst Bilgiler Ara Yazılımı seçenekleri bölümüne bakın.
services.Configure<ForwardedHeadersOptions>(options =>
{
options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});
Önemli
Yalnızca güvenilen ve ağların üst bilgileri iletmesine izin ver. Aksi takdirde, IP spoofing saldırıları mümkündür.
Ek kaynaklar
ASP.NET Core için önerilen yapılandırmada uygulama IIS/ASP.NET Core Module, Nginx veya Apache kullanılarak barındırıldı. Ara sunucular, yük dengeciler ve diğer ağ gereçleri genellikle uygulamaya ulaşmadan önce istekle ilgili bilgileri karartmaktadır:
- HTTP üzerinden HTTPS isteklerine sunucu bağlantısı olduğunda, özgün düzen (HTTPS) kaybolur ve bir üst bilgide ilet gerekir.
- Bir uygulama, İnternet'te veya kurumsal ağ üzerinde gerçek kaynağından değil ara sunucudan bir istek aldığından, kaynak istemci IP adresi de bir üst bilgide ilet gerekir.
Bu bilgiler yeniden yönlendirmeler, kimlik doğrulaması, bağlantı oluşturma, ilke değerlendirmesi ve istemci coğrafi konumu gibi istek işlemede önemli olabilir.
Iletili üst bilgiler
Kural gereği, sunucular BILGILERI HTTP üst bilgisinde iletir.
| Üst bilgi | Description |
|---|---|
| X-Forwarded-for | İsteği başlatan istemci ve sonraki yan sunuculara ilişkin bilgileri bir sunucu zincirinde tutar. Bu parametre IP adresleri (ve isteğe bağlı olarak bağlantı noktası numaraları) içerebilir. Bir ara sunucu zincirinde, ilk parametre isteğin ilk bulunduğu istemciyi belirtir. Sonraki proxy tanımlayıcıları izler. Zincirdeki son proxy, Parametreler listesinde değil. Son proxy 'nin IP adresi ve isteğe bağlı olarak bir bağlantı noktası numarası, aktarım katmanında uzak IP adresi olarak kullanılabilir. |
| X-Iletilen-proto | Kaynak düzenin değeri (HTTP/HTTPS). Bu değer, istek birden çok proxy 'ye geçen bir düzen listesi de olabilir. |
| X-Iletilen-konak | Ana bilgisayar üst bilgisi alanının özgün değeri. Genellikle, proxy 'ler ana bilgisayar üst bilgisini değiştirmez. Proxy 'nin konak üstbilgilerini doğrulamadığı veya kısıtlayamayacağı sistemleri etkileyen ayrıcalık yükselmesi güvenlik açığı hakkında bilgi için bkz. Microsoft Güvenlik Danışmanlığı CVE-2018-0787 . |
Microsoft. AspNetCore. HttpOverrides paketindeki Iletilen üstbilgiler ara yazılımı, bu üst bilgileri okur ve ilgili alanları üzerinde doldurur HttpContext .
Ara yazılım güncelleştirmeleri:
- HttpContext. Connection. Remoteıpaddress:
X-Forwarded-Forüst bilgi değerini kullanarak ayarlanır. Ek ayarlar, ara yazılımın nasıl ayarlanacağını etkilerRemoteIpAddress. Ayrıntılar için bkz. Iletilen üstbilgiler ara yazılım seçenekleri. - HttpContext. Request. Scheme:
X-Forwarded-Protoüst bilgi değerini kullanarak ayarlanır. - HttpContext. Request. Host:
X-Forwarded-Hostüst bilgi değerini kullanarak ayarlanır.
İletilen üstbilgiler ara yazılımı varsayılan ayarları yapılandırılabilir. Varsayılan ayarlar şunlardır:
- Uygulama ve isteklerin kaynağı arasında yalnızca bir ara sunucu vardır.
- Bilinen proxy 'ler ve bilinen ağlar için yalnızca geri döngü adresleri yapılandırılır.
- İletilen üstbilgiler ve olarak adlandırılır
X-Forwarded-ForX-Forwarded-Proto.
Tüm ağ gereçleri X-Forwarded-For X-Forwarded-Proto ek yapılandırma olmadan ve üst bilgilerini eklemez. Proxy istekler uygulamaya ulaştığında bu üst bilgileri içermiyorsa, Gereç üreticinizin kılavuzuna başvurun. Gereç, ve dışındaki farklı üstbilgi adlarını kullanıyorsa X-Forwarded-For X-Forwarded-Proto , ForwardedForHeaderName ve ForwardedProtoHeaderName seçeneklerini gereç tarafından kullanılan üstbilgi adlarıyla eşleşecek şekilde ayarlayın. Daha fazla bilgi için bkz. Iletilen üstbilgiler ara yazılım seçenekleri ve farklı üstbilgi adları kullanan bir proxy için yapılandırma.
ııs/IIS Express ve ASP.NET Core modülü
iletilen üstbilgiler ara yazılımı, uygulama ııs 'nin arkasında ve ASP.NET Core modülünden sonra işlem dışı barındırılıyorsa ııs tümleştirme ara yazılımı tarafından varsayılan olarak etkinleştirilir. iletilen üstbilgiler ara yazılımı, iletilen üst bilgilerle (örneğin, ıp aldatmacası) güven sorunları nedeniyle ASP.NET Core modülüne özgü kısıtlanmış bir yapılandırmaya sahip olan ara yazılım ardışık düzeninde ilk olarak çalışır. Ara yazılım, X-Forwarded-For ve üst bilgilerini iletmek üzere yapılandırılmıştır X-Forwarded-Proto ve tek bir localhost proxy ile kısıtlanır. Ek yapılandırma gerekliyse, Iletilen üstbilgiler ara yazılım seçeneklerinebakın.
Diğer proxy sunucu ve yük dengeleyici senaryoları
İşlem dışıbarındırma sırasında IIS tümleştirmesi 'nin kullanılması dışında, iletilen üstbilgiler ara yazılımı varsayılan olarak etkinleştirilmemiştir. İletilen üstbilgileri ile işlemek için bir uygulamanın yönlendirilmiş üst bilgi ara yazılımı etkinleştirilmelidir UseForwardedHeaders . Ara yazılım için Hayır belirtilmemişse, ara yazılımı etkinleştirdikten sonra ForwardedHeadersOptions varsayılan Forwardedheadersoptions. Forwardedheaders , Forwardedheaders. None' dir.
İle ara yazılımı, ForwardedHeadersOptions X-Forwarded-For içindeki ve üst bilgilerini iletecek şekilde yapılandırın X-Forwarded-Proto Startup.ConfigureServices . UseForwardedHeaders Startup.Configure Diğer ara yazılım çağrılmadan önce metodunu çağırın:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseForwardedHeaders();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
// In ASP.NET Core 1.x, replace the following line with: app.UseIdentity();
app.UseAuthentication();
app.UseMvc();
}
Not
Hiçbir ForwardedHeadersOptions Startup.ConfigureServices veya doğrudan genişletme yöntemine belirtilmemişse UseForwardedHeaders , iletmek Için varsayılan üstbilgiler Forwardedheaders. None' dır. ForwardedHeadersÖzelliğin, iletmek için üst bilgilerle yapılandırılması gerekir.
NGINX yapılandırması
X-Forwarded-ForVe X-Forwarded-Proto üst bilgilerini iletmek için bkz ngınx ile Linux üzerinde ana bilgisayar ASP.NET Core .. Daha fazla bilgi için bkz. NGINX: iletilen üstbilgiyi kullanma.
Apache yapılandırması
X-Forwarded-For otomatik olarak eklenir (bkz. Apache modülü mod_proxy: ters proxy Istek üstbilgileri). Üstbilgiyi iletme hakkında daha fazla bilgi için X-Forwarded-Proto bkz Apache ile Linux üzerinde ASP.NET Core barındırma ..
İletilen üstbilgiler ara yazılım seçenekleri
ForwardedHeadersOptions Iletilen üstbilgiler ara yazılımı davranışını denetleyin. Aşağıdaki örnek varsayılan değerleri değiştirir:
- İletilen üst bilgilerdeki giriş sayısını sınırlayın
2. - Bilinen bir proxy adresi ekleyin
127.0.10.1. - İletilen üst bilgi adını varsayılan değerinden olarak değiştirin
X-Forwarded-ForX-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";
});
| Seçenek | Açıklama |
|---|---|
| AllowedHosts | Ana bilgisayarları üst bilgiyle X-Forwarded-Host belirtilen değerlerle sınırlandırır.
IList<string> . |
| ForwardedForHeaderName | Bu özellik tarafından belirtilen üstbilgiyi, Forwardedheadersdefaults varsayılan. XForwardedForHeaderNametarafından belirtilen bir yerine kullanın. Bu seçenek, proxy/iletici üstbilgiyi kullanmıyorsa ve X-Forwarded-For bilgileri iletmek için başka bir üst bilgi kullandığında kullanılır.Varsayılan değer: X-Forwarded-For. |
| ForwardedHeaders | Hangi ileticilerin işleneceğini tanımlar. Uygulanan alanların listesi için Forwardedheaders numaralandırması ' ne bakın. Bu özelliğe atanan tipik değerler şunlardır ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto .Varsayılan değer Forwardedheaders. None' dır. |
| ForwardedHostHeaderName | Forwardedheadersdefaults varsayılan. XForwardedHostHeaderNametarafından belirtilen yerine bu özellik tarafından belirtilen üstbilgiyi kullanın. Bu seçenek, proxy/iletici üstbilgiyi kullanmıyorsa ve X-Forwarded-Host bilgileri iletmek için başka bir üst bilgi kullandığında kullanılır.Varsayılan değer: X-Forwarded-Host. |
| ForwardedProtoHeaderName | Bu özellik tarafından belirtilen üstbilgiyi, Forwardedheadersdefaults varsayılan. XForwardedProtoHeaderNametarafından belirtilen bir yerine kullanın. Bu seçenek, proxy/iletici üstbilgiyi kullanmıyorsa ve X-Forwarded-Proto bilgileri iletmek için başka bir üst bilgi kullandığında kullanılır.Varsayılan değer: X-Forwarded-Proto. |
| ForwardLimit | İşlenen üst bilgilerdeki giriş sayısını sınırlandırır. nullSınırı devre dışı bırakmak için olarak ayarlayın, ancak bu yalnızca KnownProxies veya KnownNetworks yapılandırılmışsa yapılmalıdır. Değer olmayan bir null önlem, hatalı yapılandırılmış proxy 'lerde ve ağdaki yan kanallardan gelen kötü amaçlı isteklere karşı koruma sağlamak için bir önlem (garanti değil) olarak ayarlanır.İletilen üstbilgiler ara yazılımı, üst bilgileri sağdan sola doğru sırada işler. Varsayılan değer ( 1 ) kullanılırsa, değeri artmadığı müddetçe yalnızca üst bilgilerden en sağdaki değer işlenir ForwardLimit .Varsayılan değer: 1. |
| KnownNetworks | İletilen üstbilgileri kabul etmek için bilinen ağların adres aralıkları. Sınıfsız Etki alanları arası yönlendirme (CıDR) gösterimini kullanarak IP aralıkları sağlayın. Sunucu çift modlu yuvalar kullanıyorsa, IPv4 adresleri IPv6 biçiminde sağlanır (örneğin, 10.0.0.1 IPv6 olarak temsil edilen IPv4 içinde ::ffff:10.0.0.1 ). Bkz. IPAddress. MapToIPv6. HttpContext. Connection. Remoteıpaddressöğesine bakarak bu biçimin gerekip gerekmediğini saptayın. Daha fazla bilgi için, IPv6 adresi olarak temsil edilen IPv4 adresi Için yapılandırma bölümüne bakın.Varsayılan, IList <IPNetwork için tek bir giriş içeren bir> IPAddress.Loopback . |
| KnownProxies | İletilen üstbilgileri kabul etmek için bilinen proxy 'lerin adresleri. KnownProxiesTam IP adresi eşleşmelerini belirtmek için kullanın.Sunucu çift modlu yuvalar kullanıyorsa, IPv4 adresleri IPv6 biçiminde sağlanır (örneğin, 10.0.0.1 IPv6 olarak temsil edilen IPv4 içinde ::ffff:10.0.0.1 ). Bkz. IPAddress. MapToIPv6. HttpContext. Connection. Remoteıpaddressöğesine bakarak bu biçimin gerekip gerekmediğini saptayın. Daha fazla bilgi için, IPv6 adresi olarak temsil edilen IPv4 adresi Için yapılandırma bölümüne bakın.Varsayılan, IList <IPAddress için tek bir giriş içeren bir> IPAddress.IPv6Loopback . |
| OriginalForHeaderName | Bu özellik tarafından belirtilen üstbilgiyi, Forwardedheadersdefaults varsayılan. XOriginalForHeaderNametarafından belirtilen bir yerine kullanın. Varsayılan değer: X-Original-For. |
| OriginalHostHeaderName | Forwardedheadersdefaults varsayılan. XOriginalHostHeaderNametarafından belirtilen yerine bu özellik tarafından belirtilen üstbilgiyi kullanın. Varsayılan değer: X-Original-Host. |
| OriginalProtoHeaderName | Bu özellik tarafından belirtilen üstbilgiyi, Forwardedheadersdefaults varsayılan. XOriginalProtoHeaderNametarafından belirtilen bir yerine kullanın. Varsayılan değer: X-Original-Proto. |
| RequireHeaderSymmetry | Bilgi işlem sayısının, işlenmekte olan Forwardedheadersoptions. ForwardedHeaders arasında eşitlenmiş olmasını gerektir. ASP.NET Core 1. x içindeki varsayılan değer true . ASP.NET Core 2,0 veya sonraki sürümlerde varsayılan değer false . |
Senaryolar ve kullanım örnekleri
İletilen üstbilgiler eklemek mümkün olmadığında ve tüm istekler güvenlidir
Bazı durumlarda, iletilen üstbilgileri uygulamaya yönelik isteklere eklemek mümkün olmayabilir. Proxy tüm genel dış isteklerin HTTPS olduğunu zortacaktır, Düzen Startup.Configure herhangi bir tür ara yazılım kullanılmadan önce içinde el ile ayarlanabilir:
app.Use((context, next) =>
{
context.Request.Scheme = "https";
return next();
});
Bu kod bir geliştirme veya hazırlama ortamındaki ortam değişkeniyle veya diğer yapılandırma ayarıyla devre dışı bırakılabilir.
Yol tabanı ve istek yolunu değiştiren proxy 'ler ile uğraşın
Bazı proxy 'ler yolu bozulmadan, ancak yönlendirmenin düzgün çalışması için kaldırılması gereken bir uygulama temel yolu ile geçer. Usepathbaseextensions. usepathbase ara yazılımı, yolu HttpRequest. Path ve uygulama temeli yoluna, HttpRequest. pathbaseiçine böler.
, /foo Olarak geçirilen bir ara sunucu yolu için uygulama temel yolu ise /foo/api/1 , ara yazılım Request.PathBase /foo Request.Path /api/1 aşağıdaki komutla ve olarak ayarlanır:
app.UsePathBase("/foo");
Özgün yol ve yol tabanı, ara yazılım ters ' de çağrıldığında yeniden uygulanır. Ara yazılım siparişi işleme hakkında daha fazla bilgi için bkz ASP.NET Core Middleware ..
Proxy, yolu kırpar (örneğin, ' /foo/api/1 ye iletme /api/1 ), Isteğin pathbase özelliğini ayarlayarak yeniden yönlendirmeleri ve bağlantıları düzeltir:
app.Use((context, next) =>
{
context.Request.PathBase = new PathString("/foo");
return next();
});
Proxy, yol verileri ekliyor ise, kullanarak yeniden yönlendirmeleri ve bağlantıları onarmak üzere yolun bir bölümünü atın ve özelliğini kullanarak yeniden yönlendirmeyi ve bağlantıları onarın StartsWithSegments Path :
app.Use((context, next) =>
{
if (context.Request.Path.StartsWithSegments("/foo", out var remainder))
{
context.Request.Path = remainder;
}
return next();
});
Farklı üstbilgi adları kullanan bir ara sunucu için yapılandırma
Proxy, adlı üst bilgileri kullanmıyorsa X-Forwarded-For ve X-Forwarded-Proto proxy adresini/bağlantı noktasını ve kaynak düzen bilgilerini iletmek için, ForwardedForHeaderName ve ForwardedProtoHeaderName seçeneklerini proxy tarafından kullanılan üstbilgi adlarıyla eşleşecek şekilde ayarlayın:
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";
});
IPv6 adresi olarak temsil edilen IPv4 adresinin yapılandırması
Sunucu çift modlu yuvalar kullanıyorsa, IPv4 adresleri IPv6 biçiminde sağlanır (örneğin, 10.0.0.1 IPv6 'da veya olarak temsil edilen IPv4 ::ffff:10.0.0.1 ::ffff:a00:1 ). Bkz. IPAddress. MapToIPv6. HttpContext. Connection. Remoteıpaddressöğesine bakarak bu biçimin gerekip gerekmediğini saptayın.
Aşağıdaki örnekte, iletilen üstbilgiler sağlayan bir ağ adresi KnownNetworks listeye IPv6 biçiminde eklenir.
IPv4 adresi: 10.11.12.1/8
Dönüştürülen IPv6 adresi: ::ffff:10.11.12.1
Dönüştürülen önek uzunluğu: 104
Adresi onaltılık biçimde ( 10.11.12.1 IPv6 olarak temsil edilir) de sağlayabilirsiniz ::ffff:0a0b:0c01 . Bir IPv4 adresini IPv6 'ya dönüştürürken, 8 ek ::ffff: IPv6 öneki (8 + 96 = 104) için (ÖRNEKTEKI) CIDR önek uzunluğuna 96 ekleyin.
// To access IPNetwork and IPAddress, add the following namespaces:
// using System.Net;
// using Microsoft.AspNetCore.HttpOverrides;
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.KnownNetworks.Add(new IPNetwork(
IPAddress.Parse("::ffff:10.11.12.1"), 104));
});
Linux ve IIS olmayan ters proxy 'ler için Düzen iletme
UseHttpsRedirection UseHsts Bir azure Linux App Service, Azure Linux sanal MAKINESI (VM) veya IIS 'nin yanı sıra diğer tüm ters proxy 'ler için dağıtıldığında bir siteyi çağıran ve sonsuz döngüye alan uygulamalar. TLS, ters proxy tarafından sonlandırılır ve Kestrel doğru istek düzeninden haberdar değildir. OAuth ve OıDC yanlış yeniden yönlendirmeler oluşturduğundan bu yapılandırmada de başarısız olur. UseIISIntegration IIS 'nin arkasında çalışırken Iletilen üstbilgiler ara yazılımı ekler ve yapılandırır, ancak Linux için eşleşen otomatik yapılandırma (Apache veya NGINX tümleştirmesi) yoktur.
IIS olmayan senaryolarda düzeni proxy 'den iletmek için, Iletilen üstbilgiler ara yazılımını ekleyin ve yapılandırın. İçinde Startup.ConfigureServices , aşağıdaki kodu kullanın:
// 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();
});
}
Sorun giderme
Üstbilgiler beklendiği gibi iletilemediği zaman günlüğe kaydetmeyietkinleştirin. Günlükler sorunu gidermek için yeterli bilgi sağlamıyorsa, sunucu tarafından alınan istek üstbilgilerini numaralandırın. Bir uygulama yanıtına istek üst bilgileri yazmak veya üst bilgileri günlüğe kaydetmek için satır içi ara yazılım kullanın.
Üst bilgileri uygulamanın yanıtına yazmak için, aşağıdaki Terminal satır içi ara yazılımını, içindeki çağrısından hemen sonra yerleştirin UseForwardedHeaders 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}");
});
Yanıt gövdesi yerine günlüklere yazabilirsiniz. Günlüklere yazmak, sitenin hata ayıklanırken normal şekilde çalışmasına olanak tanır.
Yanıt gövdesi yerine günlükleri yazmak için:
ILogger<Startup>StartupBaşlangıçta günlükleri oluşturmabölümünde açıklandığı gibi sınıfına ekleyin.- İçindeki çağrısından hemen sonra aşağıdaki satır içi ara yazılımı yerleştirin UseForwardedHeaders
Startup.Configure.
app.Use(async (context, next) =>
{
// Request method, scheme, and 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);
// 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();
});
İşlendiğinde, X-Forwarded-{For|Proto|Host} değerler öğesine taşınır X-Original-{For|Proto|Host} . Belirli bir üst bilgide birden çok değer varsa, Iletilen üstbilgiler ara yazılımı sağdan sola doğru sırada üst bilgileri işler. Varsayılan değer ForwardLimit 1 (bir) ise, değeri arttırılmadığı müddetçe yalnızca en sağdaki üst bilgilerden en sağdaki değer işlenir ForwardLimit .
KnownProxiesİletilen üstbilgiler işlenmeden önce isteğin özgün uzak IP 'si veya listelerindeki bir girdiyle eşleşmesi gerekir KnownNetworks . Bu, güvenilmeyen proxy 'lerden ileticileri kabul etmediği için üst bilgi yanıltmasını kısıtlar. Bilinmeyen bir proxy algılandığında günlüğe kaydetme, proxy 'nin adresini gösterir:
September 20th 2018, 15:49:44.168 Unknown proxy: 10.0.0.100:54321
Yukarıdaki örnekte, alana 10.0.0.100 bir proxy sunucusudur. Sunucu, güvenilir bir ara sunucu ise, sunucusunun IP adresini KnownProxies ' e (veya güvenilen bir ağı öğesine ekleyin) ekleyin KnownNetworks Startup.ConfigureServices . Daha fazla bilgi için Iletilen üstbilgiler ara yazılım seçenekleri bölümüne bakın.
services.Configure<ForwardedHeadersOptions>(options =>
{
options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});
Önemli
Yalnızca güvenilen proxy 'lerin ve ağların üstbilgileri iletmesine izin verir. Aksi takdirde, IP sahtekarlığı saldırıları mümkündür.