ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma

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 .

İ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 kullanarak X-Forwarded-For ayarlayın. Ek ayarlar, ara yazılım ayarlarını RemoteIpAddressetkiler. Ayrıntılar için İletilen Üst Bilgiler Ara Yazılım seçeneklerine bakın. Tüketilen değerler öğesinden X-Forwarded-Forkaldırılır ve eski değeri HttpContext.Connection.RemoteIpAddress içinde X-Original-Forkalıcı hale alınır. Not: içinde birden çok değer X-Forwarded-For/Proto/Hostvarsa, bu işlem birkaç kez tekrarlanabilir ve bu da özgün RemoteIpAddress/Host/Schemedahil olmak üzere öğesine X-Original-*taşınan birkaç değerle sonuçlanabilir.
  • HttpContext.Request.Scheme: Üst bilgi değerini kullanarak X-Forwarded-Proto ayarlayın. Tüketilen değer öğesinden X-Forwarded-Protokaldırılır ve eski değeri HttpContext.Request.Scheme içinde X-Original-Protokalıcı olarak kalır.
  • HttpContext.Request.Host: Üst bilgi değerini kullanarak X-Forwarded-Host ayarlayın. Tüketilen değer öğesinden X-Forwarded-Hostkaldırılır ve eski değeri HttpContext.Request.Host içinde X-Original-Hostkalı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 ve X-Forwarded-Protoolarak adlandırılırX-Forwarded-For.
  • ForwardedHeaders değeri, ForwardedHeaders.Noneara 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-ForX-Forwarded-Protofarklı ü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. Üst bilgiyi iletme X-Forwarded-Proto hakkında bilgi için bkz . Apache ile Linux'ta Konak ASP.NET Core.

İ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 2sınırlar.
  • bilinen bir proxy adresi 127.0.10.1ekler.
  • İletilen üst bilgi adını varsayılandan X-Forwarded-For olarak X-Forwarded-For-My-Custom-Header-Namedeğ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.
  • Değerler ordinal-ignore-case kullanılarak karşılaştırılır.
  • Bağlantı noktası numaraları dışlanmalıdır.
  • Liste boşsa, tüm konaklara izin verilir.
  • Üst düzey joker karakter * , boş olmayan tüm konaklara izin verir.
  • Alt etki alanı joker karakterlerine izin verilir, ancak kök etki alanıyla eşleşmez. Örneğin, *.contoso.com alt etki foo.contoso.com alanı ile eşleşir ancak kök etki alanı contoso.comile eşleşmez.
  • Unicode ana bilgisayar adlarına izin verilir, ancak eşleştirme için Punycode'a dönüştürülür.
  • IPv6 adresleri sınırlayıcı köşeli ayraçlar içermelidir ve geleneksel biçimde olmalıdır (örneğin, [ABCD:EF01:2345:6789:ABCD:EF01:2345:6789]). IPv6 adresleri, farklı biçimler arasındaki mantıksal eşitliği denetlemek için özel durumlu değildir ve kurallı hale getirme gerçekleştirilmez.
  • İzin verilen konakların kısıtlanmaması, bir saldırganın hizmet tarafından oluşturulan bağlantıları yanıltmasına izin verebilir.
Varsayılan değer boş 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 ayar yapmak, yanlış yapılandırılmış proxy'lere ve ağdaki 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.Bağlan bakarak bu biçimin gerekli olup olmadığını belirleyinIyon. RemoteIpAddress.

Varsayılan, için tek bir giriş içeren bir IList><IPNetworkgiriştir.IPAddress.Loopback
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.Bağlan bakarak bu biçimin gerekli olup olmadığını belirleyinIyon. RemoteIpAddress.

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_ENABLEDtrueİ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 UseCertificateForwardingUseAuthentication.
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 UseCertificateForwardingUseAuthentication.
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 KnownProxiesekleyin veya öğesine KnownNetworksgü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. Bağlan. RemoteIpAddress: Üst bilgi değerini kullanarak X-Forwarded-For ayarlayın. Ek ayarlar, ara yazılım ayarlarını RemoteIpAddressetkiler. Ayrıntılar için İletilen Üst Bilgiler Ara Yazılım seçeneklerine bakın. Tüketilen değerler öğesinden X-Forwarded-Forkaldırılır ve eski değerler içinde X-Original-Forkalıcı hale alınır. Aynı desen ve diğer üst bilgiler HostProtoiç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-Protoolarak adlandırılırX-Forwarded-For.
  • ForwardedHeaders değeri, ForwardedHeaders.Noneara 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-ForX-Forwarded-Protofarklı ü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.ConfigureServicesile ForwardedHeadersOptions iletmek X-Forwarded-ForX-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.ConfigureServicesUseForwardedHeaders Ö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). Üst bilgiyi iletme X-Forwarded-Proto hakkında bilgi için bkz . Apache ile Linux'ta Konak ASP.NET Core.

İ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 2sınırlayın.
  • bilinen bir proxy adresi 127.0.10.1ekleyin.
  • İletilen üst bilgi adını varsayılan X-Forwarded-ForX-Forwarded-For-My-Custom-Header-Nameolarak 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.
  • Değerler ordinal-ignore-case kullanılarak karşılaştırılır.
  • Bağlantı noktası numaraları dışlanmalıdır.
  • Liste boşsa, tüm konaklara izin verilir.
  • Üst düzey joker karakter * , boş olmayan tüm konaklara izin verir.
  • Alt etki alanı joker karakterlerine izin verilir, ancak kök etki alanıyla eşleşmez. Örneğin, *.contoso.com alt etki foo.contoso.com alanı ile eşleşir ancak kök etki alanı contoso.comile eşleşmez.
  • Unicode ana bilgisayar adlarına izin verilir, ancak eşleştirme için Punycode'a dönüştürülür.
  • IPv6 adresleri sınırlayıcı köşeli ayraçlar içermelidir ve geleneksel biçimde olmalıdır (örneğin, [ABCD:EF01:2345:6789:ABCD:EF01:2345:6789]). IPv6 adresleri, farklı biçimler arasındaki mantıksal eşitliği denetlemek için özel durumlu değildir ve kurallı hale getirme gerçekleştirilmez.
  • İzin verilen konakların kısıtlanmaması, bir saldırganın hizmet tarafından oluşturulan bağlantıları yanıltmasına izin verebilir.
Varsayılan değer boş 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 ayar yapmak, yanlış yapılandırılmış proxy'lere ve ağdaki 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.Bağlan bakarak bu biçimin gerekli olup olmadığını belirleyinIyon. RemoteIpAddress.

Varsayılan, için tek bir giriş içeren bir IList><IPNetworkgiriştir.IPAddress.Loopback
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.Bağlan bakarak bu biçimin gerekli olup olmadığını belirleyinIyon. RemoteIpAddress.

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 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.ConfigureServicesaş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:

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 X-Original-{For|Proto|Host}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 KnownNetworksbir 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