ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.
Tarafından Chris Ross
ASP.NET Core için önerilen yapılandırmada uygulama IIS, Nginx veya Apache için ASP.NET Core Modülü (ANCM) kullanılarak barındırılır. Ara sunucular, yük dengeleyiciler ve diğer ağ gereçleri genellikle uygulamaya ulaşmadan önce istek hakkındaki bilgileri gizler:
- HTTPS istekleri HTTP üzerinden prxied olduğunda, özgün düzen (HTTPS) kaybolur ve üst bilgide iletilmelidir.
- Bir uygulama, İnternet veya şirket ağındaki gerçek kaynağından değil proxy'den istek aldığından, kaynak istemci IP adresi de üst bilgide iletilmelidir.
Bu bilgiler istek işlemede, örneğin yeniden yönlendirmeler, kimlik doğrulaması, bağlantı oluşturma, ilke değerlendirmesi ve istemci coğrafi konumu açısından önemli olabilir.
Web grubunda çalıştırılması amaçlanan uygulamalar, web grubunda Konak ASP.NET Core'u okumalıdır.
İletilen üst bilgiler
Kural gereği proxy'ler HTTP üst bilgilerinde bilgileri iletir.
Üst bilgi | Açıklama |
---|---|
X-Forwarded-For (XFF) |
İsteği başlatan istemci ve bir ara sunucu zincirindeki sonraki proxy'ler hakkında bilgi tutar. Bu parametre IP adresleri ve isteğe bağlı olarak bağlantı noktası numaraları içerebilir. Ara sunucu zincirinde, ilk parametre isteğin ilk yapıldığı istemciyi gösterir. Sonraki proxy tanımlayıcıları takip eder. Zincirdeki son ara sunucu, parametre listesinde yer almı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 (XFP) |
Kaynak düzenin değeri, HTTP veya HTTPS. İstek birden çok ara sunucuya geçtiyse, değer bir şema listesi de olabilir. |
X-Forwarded-Host (XFH) |
Konak üst bilgisi alanının özgün değeri. Proxy'ler genellikle Konak üst bilgisini değiştirmez. Proxy'nin Ana Bilgisayar üst bilgilerini doğrulamadığı veya bilinen iyi değerlerle kısıtlamadığı sistemleri etkileyen ayrıcalıkların yükseltilmesi güvenlik açığı hakkında bilgi için bkz . Microsoft Güvenlik Danışmanlığı CVE-2018-0787 . |
X-Forwarded-Prefix |
İstemci tarafından istenen özgün temel yol. Bu üst bilgi, uygulamaların url'leri, yeniden yönlendirmeleri veya istemciye yeniden bağlantıları doğru şekilde oluşturması için yararlı olabilir. |
İletilen Üst Bilgiler Ara Yazılımı, ForwardedHeadersMiddlewarebu üst bilgileri okur ve üzerindeki HttpContextilişkili alanları doldurur.
Ara yazılım güncelleştirmeleri:
HttpContext.Connection.RemoteIpAddress
: Üst bilgi değerini kullanarakX-Forwarded-For
ayarlayın. Ek ayarlar, ara yazılım ayarlarınıRemoteIpAddress
etkiler. Ayrıntılar için İletilen Üst Bilgiler Ara Yazılım seçeneklerine bakın. Tüketilen değerler öğesindenX-Forwarded-For
kaldırılır ve eski değeriHttpContext.Connection.RemoteIpAddress
içindeX-Original-For
kalıcı hale alınır. Not: içinde birden çok değerX-Forwarded-For/Proto/Host/Prefix
varsa, bu işlem birkaç kez tekrarlanabilir ve bu da özgünRemoteIpAddress/Host/Scheme/PathBase
dahil olmak üzere öğesineX-Original-*
taşınan birkaç değerle sonuçlanabilir.HttpContext.Request.Scheme
: Üst bilgi değerini kullanarakX-Forwarded-Proto
ayarlayın. Tüketilen değer öğesindenX-Forwarded-Proto
kaldırılır ve eski değeriHttpContext.Request.Scheme
içindeX-Original-Proto
kalıcı olarak kalır.HttpContext.Request.Host
: Üst bilgi değerini kullanarakX-Forwarded-Host
ayarlayın. Tüketilen değer öğesindenX-Forwarded-Host
kaldırılır ve eski değeriHttpContext.Request.Host
içindeX-Original-Host
kalıcı olarak kalır.HttpContext.Request.PathBase
: Üst bilgi değerini kullanarakX-Forwarded-Prefix
ayarlayın. Tüketilen değer öğesindenX-Forwarded-Prefix
kaldırılır ve eski değeriHttpContext.Request.PathBase
içindeX-Original-Prefix
kalıcı olarak kalır.
Yukarıdakiler hakkında daha fazla bilgi için bu GitHub sorununa bakın.
İletilen Üst Bilgiler Ara Yazılım varsayılan ayarları yapılandırılabilir. Varsayılan ayarlar için:
- Uygulama ile 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 üst bilgiler ,
X-Forwarded-Proto
veX-Forwarded-Host
X-Forwarded-Prefix
olarak adlandırılırX-Forwarded-For
. ForwardedHeaders
değeri,ForwardedHeaders.None
ara yazılımı etkinleştirmek için istenen ileticilerin burada ayarlanması gerekir.
Tüm ağ gereçleri ek yapılandırma olmadan ve X-Forwarded-Proto
üst bilgilerini eklemezX-Forwarded-For
. Prxied istekleri uygulamaya ulaştığında bu üst bilgileri içermiyorsa alet üreticinizin kılavuzuna başvurun. Alet ve'den X-Forwarded-For
X-Forwarded-Proto
farklı üst bilgi adları kullanıyorsa ve ForwardedProtoHeaderName seçeneklerini alet tarafından kullanılan üst bilgi adlarına uyacak şekilde ayarlayınForwardedForHeaderName. Daha fazla bilgi için bkz . İletilen Üst Bilgiler Ara Yazılım seçenekleri ve Farklı üst bilgi adları kullanan bir ara sunucu için yapılandırma.
IIS/IIS Express ve ASP.NET Çekirdek Modülü
İletilen Üst Bilgiler Ara Yazılımı, uygulama IIS'nin arkasında işlem dışı olarak barındırıldığında ve IIS için ASP.NET Çekirdek Modülü'ne (ANCM) sahip olduğunda IIS Tümleştirme Ara Yazılımı tarafından varsayılan olarak etkinleştirilir. İletilen Üst Bilgiler Ara Yazılımı, ASP.NET Çekirdek Modülüne özgü kısıtlı bir yapılandırmayla ara yazılım işlem hattında ilk olarak çalıştırılacak şekilde etkinleştirilir. Kısıtlanmış yapılandırma, iletilen üst bilgilerle (örneğin, IP kimlik sahtekarlığına) ilişkin güven endişelerinden kaynaklanır. Ara yazılım ve X-Forwarded-Proto
üst bilgilerini iletecek X-Forwarded-For
şekilde yapılandırılır ve tek bir localhost proxy'si ile sınırlıdır. Ek yapılandırma gerekiyorsa İletilen Üst Bilgiler Ara Yazılım seçeneklerine bakın.
Diğer ara sunucu ve yük dengeleyici senaryoları
İşlem dışı barındırma sırasında IIS Tümleştirmesi'nin dışında, İletilen Üst Bilgiler Ara Yazılımı varsayılan olarak etkinleştirilmez. bir uygulamanın ile UseForwardedHeadersiletilen üst bilgileri işlemesi için İletilen Üst Bilgiler Ara Yazılımı etkinleştirilmelidir. Ara yazılım için belirtilmemişse ForwardedHeadersOptions ara yazılımı etkinleştirdikten sonra, varsayılan ForwardedHeadersOptions.ForwardedHeaders, ForwardedHeaders.None şeklindedir.
ve X-Forwarded-Proto
üst bilgilerini iletmek X-Forwarded-For
için ile ara yazılımı ForwardedHeadersOptions yapılandırın.
İletilen Üst Bilgiler Ara Yazılımı sırası
İletilen Üst Bilgiler Ara Yazılımı diğer ara yazılımdan önce çalıştırılmalıdır. Bu sıralama, iletilen üst bilgilere dayalı ara yazılımların işlemek üzere üst bilgi değerlerini kullanabilmesini sağlar. İletilen Üst Bilgiler Ara Yazılımı tanılama ve hata işleme sonrasında çalıştırılabilir, ancak çağrılmadan UseHstsönce çalıştırılması gerekir:
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();
Alternatif olarak, tanılamadan önce arayın UseForwardedHeaders
:
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
Belirtilmezse ForwardedHeadersOptions veya ile UseForwardedHeadersdoğrudan uzantı yöntemine uygulanırsa, iletilir varsayılan üst bilgiler ForwardedHeaders.None'dir. Özelliğin ForwardedHeaders iletilmesi için üst bilgilerle yapılandırılması gerekir.
Nginx yapılandırması
ve X-Forwarded-Proto
üst bilgilerini iletmek X-Forwarded-For
için bkz. Nginx ile Linux'ta Konak ASP.NET Core. Daha fazla bilgi için bkz . NGINX: İletilen üst bilgiyi kullanma.
Apache yapılandırması
X-Forwarded-For
otomatik olarak eklenir. Daha fazla bilgi için bkz . Apache Modülü mod_proxy: Ters Proxy İsteği Üst Bilgileri.
İletilen Üst Bilgiler Ara Yazılım seçenekleri
ForwardedHeadersOptions İletilen Üst Bilgiler Ara Yazılımının davranışını denetleyin. Aşağıdaki örnek varsayılan değerleri değiştirir:
- İletilen üst bilgilerdeki girdi sayısını ile
2
sınırlar. - bilinen bir proxy adresi
127.0.10.1
ekler. - İletilen üst bilgi adını varsayılandan
X-Forwarded-For
olarakX-Forwarded-For-My-Custom-Header-Name
değiştirir.
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();
Seçenek | Açıklama |
---|---|
AllowedHosts | Üst bilgi tarafından X-Forwarded-Host sağlanan değerlerle konakları kısıtlar.
IList<string> bir değerdir. |
ForwardedForHeaderName | ForwardedHeadersDefaults.XForwardedForHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Bu seçenek, ara sunucu/iletici üst bilgiyi kullanmadığında X-Forwarded-For ancak 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şlenmesi gerektiğini tanımlar. Geçerli alanların listesi için bkz. ForwardedHeaders Sabit Listesi. Bu özelliğe atanan tipik değerler şunlardır: ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto .Varsayılan değer ForwardedHeaders.None değeridir. |
ForwardedHostHeaderName | ForwardedHeadersDefaults.XForwardedHostHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Bu seçenek, ara sunucu/iletici üst bilgiyi kullanmadığında X-Forwarded-Host ancak bilgileri iletmek için başka bir üst bilgi kullandığında kullanılır.Varsayılan değer: X-Forwarded-Host . |
ForwardedProtoHeaderName | ForwardedHeadersDefaults.XForwardedProtoHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Bu seçenek, ara sunucu/iletici üst bilgiyi kullanmadığında X-Forwarded-Proto ancak 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 girdi sayısını sınırlar. Sınırı devre dışı bırakmak için olarak null ayarlayın, ancak bu yalnızca yapılandırıldıysa veya KnownNetworks yapılandırıldıysa KnownProxies yapılmalıdır. Değer olmayannull bir değer ayarlamak, yanlış yapılandırılmış proxy'lere ve ağ üzerindeki yan kanallardan gelen kötü amaçlı isteklere karşı koruma sağlamak için bir önlemdir (ancak garanti değildir).İletilen Üst Bilgiler Ara Yazılımı, üst bilgileri sağdan sola doğru ters sırada işler. Varsayılan değer ( 1 ) kullanılırsa, değeri artırılmadığı sürece yalnızca üst bilgilerden en sağdaki değer ForwardLimit işlenir.Varsayılan değer: 1 . |
KnownNetworks | İletilen üst bilgileri kabul etmek için bilinen ağ aralıklarını adresle. Sınıfsız Etki Alanı Arası Yönlendirme (CIDR) 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 ile temsil edilen IPv4'te olarak ::ffff:10.0.0.1 ). Bkz. IPAddress.MapToIPv6. HttpContext.Connection.RemoteIpAddress'e bakarak bu biçimin gerekli olup olmadığını belirleyin.Varsayılan, için tek bir giriş içeren bir IList ><IPNetworkgiriştir.new IPNetwork(IPAddress.Loopback, 8) |
KnownProxies | İletilen üst bilgileri kabul etmek için bilinen ara sunucuların adresleri. Tam IP adresi eşleşmelerini belirtmek için kullanın KnownProxies .Sunucu çift modlu yuvalar kullanıyorsa, IPv4 adresleri IPv6 biçiminde sağlanır (örneğin, 10.0.0.1 IPv6 ile temsil edilen IPv4'te olarak ::ffff:10.0.0.1 ). Bkz. IPAddress.MapToIPv6. HttpContext.Connection.RemoteIpAddress'e bakarak bu biçimin gerekli olup olmadığını belirleyin.Varsayılan, için tek bir giriş içeren bir IList ><IPAddressgiriştir.IPAddress.IPv6Loopback |
OriginalForHeaderName | ForwardedHeadersDefaults.XOriginalForHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Varsayılan değer: X-Original-For . |
OriginalHostHeaderName | ForwardedHeadersDefaults.XOriginalHostHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Varsayılan değer: X-Original-Host . |
OriginalProtoHeaderName | ForwardedHeadersDefaults.XOriginalProtoHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Varsayılan değer: X-Original-Proto . |
RequireHeaderSymmetry | İşlenmekte olan ForwardedHeadersOptions.ForwardedHeaders arasında üst bilgi değerlerinin eşitlenmesini gerektir. ASP.NET Core 1.x'teki varsayılan değerdir true . ASP.NET Core 2.0 veya sonraki sürümlerinde varsayılan değerdir false . |
Senaryolar ve kullanım örnekleri
İletilen üst bilgileri eklemek mümkün olmadığında ve tüm istekler güvenli olduğunda
Bazı durumlarda, uygulamaya yakın isteklere iletilen üst bilgiler eklemek mümkün olmayabilir. Ara sunucu tüm genel dış isteklerin HTTPS olduğunu zorunlu çalıştırıyorsa, düzen herhangi bir ara yazılım türü kullanmadan önce el ile ayarlanabilir:
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();
Bu kod, geliştirme veya hazırlama ortamında ortam değişkeni veya başka bir yapılandırma ayarıyla devre dışı bırakılabilir:
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();
İstek yolunu değiştiren yol tabanı ve proxy'lerle çalışma
Bazı proxy'ler yolu olduğu gibi geçirir, ancak yönlendirmenin düzgün çalışması için kaldırılması gereken bir uygulama temel yolu vardır. UsePathBaseExtensions.UsePathBase ara yazılımı yolu HttpRequest.Path'a, uygulama temel yolunu da HttpRequest.PathBase'e böler.
olarak geçirilen bir ara sunucu yolunun uygulama temel yolu ise /foo
ara yazılım aşağıdaki komutla olarak ve Request.Path
olarak /api/1
ayarlanır Request.PathBase
/foo
:/foo/api/1
app.UsePathBase("/foo");
// ...
app.UseRouting();
Not
WebApplication kullanılırken (bkz. ASP.NET Core 5.0'dan 6.0'a geçiş) app.UseRouting
, yönlendirme ara yazılımının eşleşen yollardan önce değiştirilmiş yolu gözlemlemesi için UsePathBase
öğesinden sonra çağrılmalıdır. Aksi takdirde yollar, Ara Yazılım Sıralama ve Yönlendirme makalelerinde açıklandığı gibi UsePathBase
tarafından yollar yeniden yazmadan önce eşleştirilir.
Ara yazılım ters olarak yeniden çağrıldığında özgün yol ve yol tabanı yeniden uygulanır. Ara yazılım sipariş işleme hakkında daha fazla bilgi için bkz . ASP.NET Core Ara Yazılımı.
Ara sunucu yolu kırpıyorsa (örneğin, iletme /foo/api/1
/api/1
), isteğin PathBase özelliğini ayarlayarak yeniden yönlendirmeleri ve bağlantıları düzeltin:
app.Use((context, next) =>
{
context.Request.PathBase = new PathString("/foo");
return next(context);
});
Ara sunucu yol verileri ekliyorsa, özelliğini kullanarak StartsWithSegments ve atayarak yeniden yönlendirmeleri ve bağlantıları düzeltmek için Path yolun bir bölümünü atın:
app.Use((context, next) =>
{
if (context.Request.Path.StartsWithSegments("/foo", out var remainder))
{
context.Request.Path = remainder;
}
return next(context);
});
Farklı üst bilgi adları kullanan bir ara sunucu için yapılandırma
Proxy, proxy adresi/bağlantı noktası ve kaynak şema bilgilerini iletmek için ve adlı X-Forwarded-For
üst bilgileri kullanmıyorsa ve ForwardedProtoHeaderName seçeneklerini ara sunucu tarafından kullanılan üst bilgi adlarıyla eşleşecek şekilde ayarlayınForwardedForHeaderName:X-Forwarded-Proto
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();
Linux ve IIS dışı ters proxy'ler için şemayı iletme
Bir Azure Linux App Service'e, Azure Linux sanal makinesine (VM) veya IIS dışındaki diğer ters ara sunucuların arkasına dağıtılırsa, bir siteyi çağıran UseHttpsRedirection ve UseHsts sonsuz döngüye yerleştiren uygulamalar. TLS ters ara sunucu tarafından sonlandırılır ve Kestrel doğru istek şemasının farkında değildir. OAuth ve OIDC de yanlış yeniden yönlendirmeler oluşturduğundan bu yapılandırmada başarısız olur. UseIISIntegration IIS arkasında çalışırken İletilen Üst Bilgiler Ara Yazılımı ekler ve yapılandırılır, ancak Linux için eşleşen otomatik yapılandırma yoktur (Apache veya Nginx tümleştirmesi).
IIS dışı senaryolarda proxy'den şemayı iletmek için, olarak ayarlayarak ASPNETCORE_FORWARDEDHEADERS_ENABLED
true
İletilen Üst Bilgiler Ara Yazılımını etkinleştirin. Uyarı: Bu bayrak, bulut ortamları için tasarlanmış ayarları kullanır ve hangi IP ileticilerinin kabul edildiğine kısıtlama gibi KnownProxies option
özellikleri etkinleştirmez.
Sertifika iletme
Azure
Azure Uygulaması Hizmeti'ni sertifika iletme için yapılandırmak için bkz. Azure Uygulaması Hizmeti için TLS karşılıklı kimlik doğrulamasını yapılandırma. Aşağıdaki kılavuz, ASP.NET Core uygulamasını yapılandırmayla ilgilidir.
- Azure'ın kullandığı üst bilgi adını belirtmek için Sertifika İletme Ara Yazılımını yapılandırın. Ara yazılım tarafından sertifikanın oluşturulduğu üst bilgiyi yapılandırmak için aşağıdaki kodu ekleyin.
- çağrısından önce öğesini arayın UseCertificateForwarding 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();
Diğer web proxy'leri
IIS olmayan bir ara sunucu kullanılıyorsa veya Hizmetin Uygulama İsteği Yönlendirmesi (ARR) Azure Uygulaması, proxy'yi bir HTTP üst bilgisinde aldığı sertifikayı iletecek şekilde yapılandırın.
- Üst bilgi adını belirtmek için Sertifika İletme Ara Yazılımını yapılandırın. Ara yazılım tarafından sertifikanın oluşturulduğu üst bilgiyi yapılandırmak için aşağıdaki kodu ekleyin.
- çağrısından önce öğesini arayın UseCertificateForwarding 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();
Proxy, Nginx'de olduğu gibi sertifikayı base64 kodlaması yapmıyorsa seçeneğini ayarlayın HeaderConverter
. Aşağıdaki örneği inceleyin:
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();
Sorun giderme
Üst bilgiler beklendiği gibi iletilmiyorsa, düzey günlüğünü ve HTTP isteği günlüğünü etkinleştirindebug
. UseHttpLogging ' den sonra UseForwardedHeadersçağrılmalıdır:
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();
Belirli bir üst bilgide birden çok değer varsa, İletilen Üst Bilgiler Ara Yazılımı üst bilgileri sağdan sola doğru ters sırada işler. Varsayılan ForwardLimit
değer (bir) olduğundan 1
, değeri artırılmadığı sürece yalnızca üst bilgilerden en sağdaki değer ForwardLimit
işlenir.
İletilen üst bilgiler işlenmeden önce isteğin özgün uzak IP'sinin KnownProxies veya KnownNetworks listelerindeki bir girdiyle eşleşmesi gerekir. Bu, güvenilmeyen proxy'lerden ileticileri kabul etmeyerek üst bilgi yanıltma işlemini sınırlar. Bilinmeyen bir ara sunucu 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, 10.0.0.100 bir ara sunucudur. Sunucu güvenilen bir ara sunucuysa, sunucusuna sunucunun IP adresini KnownProxies
ekleyin veya öğesine KnownNetworks
güvenilen bir ağ ekleyin. Daha fazla bilgi için İletilen Üst Bilgiler Ara Yazılım seçenekleri bölümüne bakın.
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();
Günlükleri görüntülemek için dosyaya appsettings.Development.json
ekleyin"Microsoft.AspNetCore.HttpLogging": "Information"
:
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Microsoft.AspNetCore.HttpLogging": "Information"
}
}
}
Önemli
Yalnızca güvenilen proxy'lerin ve ağların üst bilgileri iletmesine izin verin. Aksi takdirde, IP kimlik sahtekarlık saldırıları mümkündür.
Ek kaynaklar
ASP.NET Core için önerilen yapılandırmada uygulama IIS/ASP.NET Core Modülü, Nginx veya Apache kullanılarak barındırılır. Ara sunucular, yük dengeleyiciler ve diğer ağ gereçleri genellikle uygulamaya ulaşmadan önce istek hakkındaki bilgileri gizler:
- HTTPS istekleri HTTP üzerinden prxied olduğunda, özgün düzen (HTTPS) kaybolur ve üst bilgide iletilmelidir.
- Bir uygulama, İnternet veya şirket ağındaki gerçek kaynağından değil proxy'den istek aldığından, kaynak istemci IP adresi de üst bilgide iletilmelidir.
Bu bilgiler istek işlemede, örneğin yeniden yönlendirmeler, kimlik doğrulaması, bağlantı oluşturma, ilke değerlendirmesi ve istemci coğrafi konumu açısından önemli olabilir.
İletilen üst bilgiler
Kural gereği proxy'ler HTTP üst bilgilerinde bilgileri iletir.
Üst bilgi | Açıklama |
---|---|
X İletilmiş-For | İsteği başlatan istemci ve bir ara sunucu zincirindeki sonraki proxy'ler hakkında bilgi tutar. Bu parametre IP adresleri (ve isteğe bağlı olarak bağlantı noktası numaraları) içerebilir. Ara sunucu zincirinde, ilk parametre isteğin ilk yapıldığı istemciyi gösterir. Sonraki proxy tanımlayıcıları takip eder. Zincirdeki son ara sunucu, parametre listesinde yer almı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 İletilmiş-Proto | Kaynak düzenin değeri (HTTP/HTTPS). İstek birden çok ara sunucuya geçtiyse, değer bir şema listesi de olabilir. |
X İletilmiş Ana Bilgisayar | Konak üst bilgisi alanının özgün değeri. Proxy'ler genellikle Konak üst bilgisini değiştirmez. Proxy'nin Ana Bilgisayar üst bilgilerini doğrulamadığı veya bilinen iyi değerlerle kısıtlamadığı sistemleri etkileyen ayrıcalıkların yükseltilmesi güvenlik açığı hakkında bilgi için bkz . Microsoft Güvenlik Danışmanlığı CVE-2018-0787 . |
İletilen Üst Bilgiler Ara Yazılımı (ForwardedHeadersMiddleware ), bu üst bilgileri okur ve üzerindeki HttpContextilişkili alanları doldurur.
Ara yazılım güncelleştirmeleri:
- HttpContext.Connection.RemoteIpAddress: Üst bilgi değerini kullanarak
X-Forwarded-For
ayarlayın. Ek ayarlar, ara yazılım ayarlarınıRemoteIpAddress
etkiler. Ayrıntılar için İletilen Üst Bilgiler Ara Yazılım seçeneklerine bakın. Tüketilen değerler öğesindenX-Forwarded-For
kaldırılır ve eski değerler içindeX-Original-For
kalıcı hale alınır. Aynı desen ve diğer üst bilgilerHost
Proto
için de uygulanır. - HttpContext.Request.Scheme: Üst bilgi değerini kullanarak
X-Forwarded-Proto
ayarlayın. - HttpContext.Request.Host: Üst bilgi değerini kullanarak
X-Forwarded-Host
ayarlayın.
Yukarıdakiler hakkında daha fazla bilgi için bu GitHub sorununa bakın.
İletilen Üst Bilgiler Ara Yazılım varsayılan ayarları yapılandırılabilir. Varsayılan ayarlar için:
- Uygulama ile 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 üst bilgiler ve
X-Forwarded-Proto
olarak adlandırılırX-Forwarded-For
. ForwardedHeaders
değeri,ForwardedHeaders.None
ara yazılımı etkinleştirmek için istenen ileticilerin burada ayarlanması gerekir.
Tüm ağ gereçleri ek yapılandırma olmadan ve X-Forwarded-Proto
üst bilgilerini eklemezX-Forwarded-For
. Prxied istekleri uygulamaya ulaştığında bu üst bilgileri içermiyorsa alet üreticinizin kılavuzuna başvurun. Alet ve'den X-Forwarded-For
X-Forwarded-Proto
farklı üst bilgi adları kullanıyorsa ve ForwardedProtoHeaderName seçeneklerini alet tarafından kullanılan üst bilgi adlarına uyacak şekilde ayarlayınForwardedForHeaderName. Daha fazla bilgi için bkz . İletilen Üst Bilgiler Ara Yazılım seçenekleri ve Farklı üst bilgi adları kullanan bir ara sunucu için yapılandırma.
IIS/IIS Express ve ASP.NET Çekirdek Modülü
İletilen Üst Bilgiler Ara Yazılımı, uygulama IIS ve ASP.NET Core Modülü arkasında işlem dışı olarak barındırıldığında IIS Tümleştirme Ara Yazılımı tarafından varsayılan olarak etkinleştirilir. İletilen Üst Bilgiler Ara Yazılımı, iletilen üst bilgilerle ilgili güven endişeleri (örneğin, IP kimlik sahtekarlığına) bağlı olarak ASP.NET Çekirdek Modülüne özgü kısıtlı bir yapılandırmayla ara yazılım işlem hattında ilk olarak çalıştırılacak şekilde etkinleştirilir. Ara yazılım ve X-Forwarded-Proto
üst bilgilerini iletecek X-Forwarded-For
şekilde yapılandırılır ve tek bir localhost proxy'si ile sınırlıdır. Ek yapılandırma gerekiyorsa İletilen Üst Bilgiler Ara Yazılım seçeneklerine bakın.
Diğer ara sunucu ve yük dengeleyici senaryoları
İşlem dışı barındırma sırasında IIS Tümleştirmesi'nin dışında, İletilen Üst Bilgiler Ara Yazılımı varsayılan olarak etkinleştirilmez. bir uygulamanın ile UseForwardedHeadersiletilen üst bilgileri işlemesi için İletilen Üst Bilgiler Ara Yazılımı etkinleştirilmelidir. Ara yazılım için belirtilmemişse ForwardedHeadersOptions ara yazılımı etkinleştirdikten sonra, varsayılan ForwardedHeadersOptions.ForwardedHeaders, ForwardedHeaders.None şeklindedir.
ve üst bilgilerini Startup.ConfigureServices
ile ForwardedHeadersOptions iletmek X-Forwarded-For
X-Forwarded-Proto
için ile ara yazılımı yapılandırın.
İletilen Üst Bilgiler Ara Yazılımı sırası
İletilen Üst Bilgiler Ara Yazılımı diğer ara yazılımlardan önce çalıştırılmalıdır. Bu sıralama, iletilen üst bilgilere dayalı ara yazılımların işlemek üzere üst bilgi değerlerini kullanabilmesini sağlar. İletilen Üst Bilgiler Ara Yazılımı tanılama ve hata işleme sonrasında çalıştırılabilir, ancak çağrılmadan UseHsts
önce çalıştırılması 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, tanılamadan önce arayın UseForwardedHeaders
:
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 belirtilmemişseForwardedHeadersOptions, iletecek varsayılan üst bilgiler ForwardedHeaders.None şeklindedir.Startup.ConfigureServices
UseForwardedHeaders Özelliğin ForwardedHeaders iletilmesi için üst bilgilerle yapılandırılması gerekir.
Nginx yapılandırması
ve X-Forwarded-Proto
üst bilgilerini iletmek X-Forwarded-For
için bkz. Nginx ile Linux'ta Konak ASP.NET Core. Daha fazla bilgi için bkz . NGINX: İletilen üst bilgiyi kullanma.
Apache yapılandırması
X-Forwarded-For
otomatik olarak eklenir (bkz . Apache Modülü mod_proxy: Ters Proxy İsteği Üst Bilgileri).
İletilen Üst Bilgiler Ara Yazılım seçenekleri
ForwardedHeadersOptions İletilen Üst Bilgiler Ara Yazılımının davranışını denetleyin. Aşağıdaki örnek varsayılan değerleri değiştirir:
- İletilen üst bilgilerdeki girdi sayısını ile
2
sınırlayın. - bilinen bir proxy adresi
127.0.10.1
ekleyin. - İletilen üst bilgi adını varsayılan
X-Forwarded-For
X-Forwarded-For-My-Custom-Header-Name
olarak değiştirin.
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 | Üst bilgi tarafından X-Forwarded-Host sağlanan değerlerle konakları kısıtlar.
IList<string> bir değerdir. |
ForwardedHeaders | hangi ileticilerin işlenmesi gerektiğini tanımlar. Geçerli alanların listesi için bkz. ForwardedHeaders Sabit Listesi. Bu özelliğe atanan tipik değerler şunlardır: ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto .Varsayılan değer ForwardedHeaders.None değeridir. |
ForwardedForHeaderName | ForwardedHeadersDefaults.XForwardedForHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Bu seçenek, ara sunucu/iletici üst bilgiyi kullanmadığında X-Forwarded-For ancak bilgileri iletmek için başka bir üst bilgi kullandığında kullanılır.Varsayılan değer: X-Forwarded-For . |
ForwardedHostHeaderName | ForwardedHeadersDefaults.XForwardedHostHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Bu seçenek, ara sunucu/iletici üst bilgiyi kullanmadığında X-Forwarded-Host ancak bilgileri iletmek için başka bir üst bilgi kullandığında kullanılır.Varsayılan değer: X-Forwarded-Host . |
ForwardedProtoHeaderName | ForwardedHeadersDefaults.XForwardedProtoHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Bu seçenek, ara sunucu/iletici üst bilgiyi kullanmadığında X-Forwarded-Proto ancak bilgileri iletmek için başka bir üst bilgi kullandığında kullanılır.Varsayılan değer: X-Forwarded-Proto . |
ForwardedPrefixHeaderName | ForwardedHeadersDefaults.XForwardedPrefixHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Bu seçenek, ara sunucu/iletici üst bilgiyi kullanmadığında X-Forwarded-Prefix ancak bilgileri iletmek için başka bir üst bilgi kullandığında kullanılır.Varsayılan değer: X-Forwarded-Prefix . |
ForwardLimit | İşlenen üst bilgilerdeki girdi sayısını sınırlar. Sınırı devre dışı bırakmak için olarak null ayarlayın, ancak bu yalnızca yapılandırıldıysa veya KnownNetworks yapılandırıldıysa KnownProxies yapılmalıdır. Değer olmayannull bir değer ayarlamak, yanlış yapılandırılmış proxy'lere ve ağ üzerindeki yan kanallardan gelen kötü amaçlı isteklere karşı koruma sağlamak için bir önlemdir (ancak garanti değildir).İletilen Üst Bilgiler Ara Yazılımı, üst bilgileri sağdan sola doğru ters sırada işler. Varsayılan değer ( 1 ) kullanılırsa, değeri artırılmadığı sürece yalnızca üst bilgilerden en sağdaki değer ForwardLimit işlenir.Varsayılan değer: 1 . |
KnownNetworks | İletilen üst bilgileri kabul etmek için bilinen ağ aralıklarını adresle. Sınıfsız Etki Alanı Arası Yönlendirme (CIDR) 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 ile temsil edilen IPv4'te olarak ::ffff:10.0.0.1 ). Bkz. IPAddress.MapToIPv6. HttpContext.Connection.RemoteIpAddress'e bakarak bu biçimin gerekli olup olmadığını belirleyin.Varsayılan, için tek bir giriş içeren bir IList ><IPNetworkgiriştir.new IPNetwork(IPAddress.Loopback, 8) |
KnownProxies | İletilen üst bilgileri kabul etmek için bilinen ara sunucuların adresleri. Tam IP adresi eşleşmelerini belirtmek için kullanın KnownProxies .Sunucu çift modlu yuvalar kullanıyorsa, IPv4 adresleri IPv6 biçiminde sağlanır (örneğin, 10.0.0.1 IPv6 ile temsil edilen IPv4'te olarak ::ffff:10.0.0.1 ). Bkz. IPAddress.MapToIPv6. HttpContext.Connection.RemoteIpAddress'e bakarak bu biçimin gerekli olup olmadığını belirleyin.Varsayılan, için tek bir giriş içeren bir IList ><IPAddressgiriştir.IPAddress.IPv6Loopback |
OriginalForHeaderName | ForwardedHeadersDefaults.XOriginalForHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Varsayılan değer: X-Original-For . |
OriginalHostHeaderName | ForwardedHeadersDefaults.XOriginalHostHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Varsayılan değer: X-Original-Host . |
OriginalProtoHeaderName | ForwardedHeadersDefaults.XOriginalProtoHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Varsayılan değer: X-Original-Proto . |
OriginalPrefixHeaderName | ForwardedHeadersDefaults.XOriginalPrefixHeaderName tarafından belirtilen üst bilgi yerine bu özellik tarafından belirtilen üst bilgiyi kullanın. Varsayılan değer: X-Original-Prefix . |
RequireHeaderSymmetry | İşlenmekte olan ForwardedHeadersOptions.ForwardedHeaders arasında üst bilgi değerlerinin eşitlenmesini gerektir. ASP.NET Core 1.x'teki varsayılan değerdir true . ASP.NET Core 2.0 veya sonraki sürümlerinde varsayılan değerdir false . |
Senaryolar ve kullanım örnekleri
İletilen üst bilgileri eklemek mümkün olmadığında ve tüm istekler güvenli olduğunda
Bazı durumlarda, uygulamaya yakın isteklere iletilen üst bilgiler eklemek mümkün olmayabilir. Ara sunucu tüm genel dış isteklerin HTTPS olduğunu zorunluyorsa, düzen herhangi bir ara yazılım türü kullanmadan önce el ile ayarlanabilir Startup.Configure
:
app.Use((context, next) =>
{
context.Request.Scheme = "https";
return next();
});
Bu kod, geliştirme veya hazırlama ortamında ortam değişkeni veya başka bir yapılandırma ayarıyla devre dışı bırakılabilir.
İstek yolunu değiştiren yol tabanı ve proxy'lerle ilgilenme
Bazı proxy'ler yolu olduğu gibi geçirir, ancak yönlendirmenin düzgün çalışması için kaldırılması gereken bir uygulama temel yolu vardır. UsePathBaseExtensions.UsePathBase ara yazılımı yolu HttpRequest.Path'a, uygulama temel yolunu da HttpRequest.PathBase'e böler.
olarak geçirilen bir ara sunucu yolunun uygulama temel yolu ise /foo
ara yazılım aşağıdaki komutla olarak ve Request.Path
olarak /api/1
ayarlanır Request.PathBase
/foo
:/foo/api/1
app.UsePathBase("/foo");
Ara yazılım ters olarak yeniden çağrıldığında özgün yol ve yol tabanı yeniden uygulanır. Ara yazılım sipariş işleme hakkında daha fazla bilgi için bkz . ASP.NET Core Ara Yazılımı.
Ara sunucu yolu kırpıyorsa (örneğin, iletme /foo/api/1
/api/1
), isteğin PathBase özelliğini ayarlayarak yeniden 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, özelliğini kullanarak StartsWithSegments ve atayarak yeniden yönlendirmeleri ve bağlantıları düzeltmek için Path yolun bir bölümünü 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
Proxy, proxy adresi/bağlantı noktası ve kaynak şema bilgilerini iletmek için ve adlı X-Forwarded-For
üst bilgileri kullanmıyorsa ve ForwardedProtoHeaderName seçeneklerini ara sunucu tarafından kullanılan üst bilgi adlarıyla eşleşecek şekilde ayarlayınForwardedForHeaderName:X-Forwarded-Proto
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 dışı ters proxy'ler için şemayı iletme
Bir Azure Linux App Service'e, Azure Linux sanal makinesine (VM) veya IIS dışındaki diğer ters ara sunucuların arkasına dağıtılırsa, bir siteyi çağıran UseHttpsRedirection ve UseHsts sonsuz döngüye yerleştiren uygulamalar. TLS ters ara sunucu tarafından sonlandırılır ve Kestrel doğru istek şemasının farkında değildir. OAuth ve OIDC de yanlış yeniden yönlendirmeler oluşturduğundan bu yapılandırmada başarısız olur. UseIISIntegration IIS arkasında çalışırken İletilen Üst Bilgiler Ara Yazılımı ekler ve yapılandırılır, ancak Linux için eşleşen otomatik yapılandırma yoktur (Apache veya Nginx tümleştirmesi).
IIS dışı senaryolarda düzeni proxy'den iletmek için İletilen Üst Bilgiler Ara Yazılımı 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
Azure Uygulaması Hizmeti'ni sertifika iletme için yapılandırmak için bkz. Azure Uygulaması Hizmeti için TLS karşılıklı kimlik doğrulamasını yapılandırma. Aşağıdaki kılavuz, ASP.NET Core uygulamasını yapılandırmayla ilgilidir.
içinde Startup.Configure
çağrısından app.UseAuthentication();
önce aşağıdaki kodu ekleyin:
app.UseCertificateForwarding();
Azure'ın kullandığı üst bilgi adını belirtmek için Sertifika İletme Ara Yazılımını yapılandırın. içinde Startup.ConfigureServices
, ara yazılım tarafından sertifikanın oluşturulduğu üst bilgiyi yapılandırmak için aşağıdaki kodu ekleyin:
services.AddCertificateForwarding(options =>
options.CertificateHeader = "X-ARR-ClientCert");
Diğer web proxy'leri
IIS olmayan bir ara sunucu kullanılıyorsa veya Hizmetin Uygulama İsteği Yönlendirmesi (ARR) Azure Uygulaması, proxy'yi bir HTTP üst bilgisinde aldığı sertifikayı iletecek şekilde yapılandırın. içinde Startup.Configure
çağrısından app.UseAuthentication();
önce aşağıdaki kodu ekleyin:
app.UseCertificateForwarding();
Üst bilgi adını belirtmek için Sertifika İletme Ara Yazılımını yapılandırın. içinde Startup.ConfigureServices
, ara yazılım tarafından sertifikanın oluşturulduğu üst bilgiyi yapılandırmak için aşağıdaki kodu ekleyin:
services.AddCertificateForwarding(options =>
options.CertificateHeader = "YOUR_CERTIFICATE_HEADER_NAME");
Ara sunucu sertifikayı base64 kodlaması yapmıyorsa (Nginx'de olduğu gibi) seçeneğini ayarlayın HeaderConverter
. aşağıdaki örneği göz Startup.ConfigureServices
önünde bulundurun:
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 iletilmiyorsa günlüğe kaydetmeyi etkinleştirin. Günlükler sorunu gidermek için yeterli bilgi sağlamıyorsa, sunucu tarafından alınan istek üst bilgilerini numaralandırın. 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ğrısından hemen sonra UseForwardedHeaders aşağıdaki terminal satır içi ara yazılımını yazın 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 yazma, hata ayıklama sırasında sitenin normal çalışmasını sağlar.
Günlükleri yanıt gövdesine yazmak yerine yazmak için:
- Başlangıç'ta
Startup
günlük oluşturma bölümünde açıklandığı gibi sınıfına ekleyinILogger<Startup>
. - çağrısından hemen sonra aşağıdaki satır içi ara yazılımı 'a UseForwardedHeaders
Startup.Configure
yerleştirin.
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();
});
İşlendiğinde, X-Forwarded-{For|Proto|Host|Prefix}
değerler öğesine X-Original-{For|Proto|Host|Prefix}
taşınır. Belirli bir üst bilgide birden çok değer varsa, İletilen Üst Bilgiler Ara Yazılımı üst bilgileri sağdan sola doğru ters sırada işler. Varsayılan ForwardLimit
değer (bir) olduğundan 1
, değeri artırılmadığı sürece yalnızca üst bilgilerden en sağdaki değer ForwardLimit
işlenir.
İletilen üst bilgiler işlenmeden önce isteğin özgün uzak IP'sinin KnownProxies
veya KnownNetworks
listelerindeki bir girdiyle eşleşmesi gerekir. Bu, güvenilmeyen proxy'lerden ileticileri kabul etmeyerek üst bilgi yanıltma işlemini sınırlar. Bilinmeyen bir ara sunucu 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, 10.0.0.100 bir ara sunucudur. Sunucu güvenilen bir ara sunucuysa, içindeki sunucusuna sunucunun IP adresini KnownProxies
ekleyin (veya güvenilen KnownNetworks
bir ağ ekleyin).Startup.ConfigureServices
Daha fazla bilgi için İletilen Ü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 proxy'lerin ve ağların üst bilgileri iletmesine izin verin. Aksi takdirde, IP kimlik sahtekarlık saldırıları mümkündür.
Ek kaynaklar
ASP.NET Core