プロキシ サーバーとロード バランサーを使用するために ASP.NET Core を構成するConfigure ASP.NET Core to work with proxy servers and load balancers

著者: Luke LathamChris RossBy Luke Latham and Chris Ross

ASP.NET Core の推奨される構成では、アプリは IIS/ASP.NET Core モジュール、Nginx、または Apache を使ってホストされます。In the recommended configuration for ASP.NET Core, the app is hosted using IIS/ASP.NET Core Module, Nginx, or Apache. プロキシ サーバー、ロード バランサー、および他のネットワーク アプライアンスにより、要求に関する情報が、アプリに到達する前にわからなくなることがよくあります。Proxy servers, load balancers, and other network appliances often obscure information about the request before it reaches the app:

  • HTTPS 要求が HTTP によってプロキシされると、元のスキーム (HTTPS) は失われ、ヘッダーで転送される必要があります。When HTTPS requests are proxied over HTTP, the original scheme (HTTPS) is lost and must be forwarded in a header.
  • アプリは、インターネット上または社内ネットワーク上の本来の送信元ではなく、プロキシから要求を受信するため、送信元クライアントの IP アドレスもヘッダーで転送される必要があります。Because an app receives a request from the proxy and not its true source on the Internet or corporate network, the originating client IP address must also be forwarded in a header.

この情報は、リダイレクト、認証、リンクの生成、ポリシーの評価、クライアントの位置情報など、要求の処理で重要になる可能性があります。This information may be important in request processing, for example in redirects, authentication, link generation, policy evaluation, and client geolocation.

転送されるヘッダーForwarded headers

慣例によりは、プロキシは HTTP ヘッダーで情報を転送します。By convention, proxies forward information in HTTP headers.

HeaderHeader 説明Description
X-Forwarded-ForX-Forwarded-For 要求を開始したクライアントと、プロキシ チェーン内の後続のプロキシに関する情報を保持します。Holds information about the client that initiated the request and subsequent proxies in a chain of proxies. このパラメーターは、IP アドレス (および、必要に応じてポート番号) を含むことがあります。This parameter may contain IP addresses (and, optionally, port numbers). プロキシ サーバーのチェーンにおいては、最初のパラメーターが、要求を最初に行ったクライアントを示します。In a chain of proxy servers, the first parameter indicates the client where the request was first made. その後に、後続のプロキシの識別子が指定されています。Subsequent proxy identifiers follow. チェーン内の最後のプロキシは、パラメーターのリストには含まれません。The last proxy in the chain isn't in the list of parameters. 最後のプロキシの IP アドレスとオプションのポート番号は、トランスポート層のリモート IP アドレスとして入手できます。The last proxy's IP address, and optionally a port number, are available as the remote IP address at the transport layer.
X-Forwarded-ProtoX-Forwarded-Proto 開始スキーム (HTTP/HTTPS) の値です。The value of the originating scheme (HTTP/HTTPS). 要求が複数のプロキシを通過している場合、値はスキームのリストである場合もあります。The value may also be a list of schemes if the request has traversed multiple proxies.
X-Forwarded-HostX-Forwarded-Host ホスト ヘッダー フィールドの元の値です。The original value of the Host header field. 通常、プロキシはホスト ヘッダーを変更しません。Usually, proxies don't modify the Host header. プロキシにおいてホスト ヘッダーが既知の適切な値であることが検証されない、または既知の適切な値に制限されないシステムに影響を与える、特権の昇格脆弱性については、マイクロソフト セキュリティ アドバイザリ CVE-2018-0787 をご覧ください。See Microsoft Security Advisory CVE-2018-0787 for information on an elevation-of-privileges vulnerability that affects systems where the proxy doesn't validate or restict Host headers to known good values.

Microsoft.AspNetCore.HttpOverrides パッケージの Forwarded Headers Middleware は、これらのヘッダーを読み取り、HttpContext の関連するフィールドに設定します。The Forwarded Headers Middleware, from the Microsoft.AspNetCore.HttpOverrides package, reads these headers and fills in the associated fields on HttpContext.

ミドルウェアの更新:The middleware updates:

Forwarded Headers Middleware の既定の設定は構成できます。Forwarded Headers Middleware default settings can be configured. 既定の設定は次のとおりです。The default settings are:

  • アプリと要求のソースの間には、"1 つのプロキシ" だけが存在します。There is only one proxy between the app and the source of the requests.
  • 既知のプロキシと既知のネットワークに対しては、ループバック アドレスのみが構成されています。Only loopback addresses are configured for known proxies and known networks.
  • 転送されるヘッダーには X-Forwarded-ForX-Forwarded-Proto の名前が付けられます。The forwarded headers are named X-Forwarded-For and X-Forwarded-Proto.

すべてのネットワーク アプライアンスが追加構成なしで X-Forwarded-For および X-Forwarded-Proto ヘッダーを追加するわけではありません。Not all network appliances add the X-Forwarded-For and X-Forwarded-Proto headers without additional configuration. プロキシされた要求がアプリに届いたときにこれらのヘッダーが含まれていない場合は、アプライアンスの製造元のガイダンスを参照してください。Consult your appliance manufacturer's guidance if proxied requests don't contain these headers when they reach the app. アプライアンスが X-Forwarded-ForX-Forwarded-Proto 以外の名前を使用している場合は、アプライアンスで使用されるヘッダー名と一致するように ForwardedForHeaderNameForwardedProtoHeaderName のオプションを設定してください。If the appliance uses different header names than X-Forwarded-For and X-Forwarded-Proto, set the ForwardedForHeaderName and ForwardedProtoHeaderName options to match the header names used by the appliance. 詳細については、「Forwarded Headers Middleware のオプション」と「別のヘッダー名を使用するプロキシの構成」を参照してください。For more information, see Forwarded Headers Middleware options and Configuration for a proxy that uses different header names.

IIS/IIS Express と ASP.NET Core モジュールIIS/IIS Express and ASP.NET Core Module

アプリが IIS と ASP.NET Core モジュールの背後で実行されると、IIS Integration Middleware は Forwarded Headers Middleware を既定で有効にします。Forwarded Headers Middleware is enabled by default by IIS Integration Middleware when the app is run behind IIS and the ASP.NET Core Module. 転送されるヘッダーの信頼に関する問題のため (たとえば、IP スプーフィング)、Forwarded Headers Middleware はアクティブ化されると最初に、ASP.NET Core モジュールに固有の制限された構成を使って、ミドルウェア パイプライン内で実行します。Forwarded Headers Middleware is activated to run first in the middleware pipeline with a restricted configuration specific to the ASP.NET Core Module due to trust concerns with forwarded headers (for example, IP spoofing). ミドルウェアは、X-Forwarded-For および X-Forwarded-Proto ヘッダーを転送するように構成され、単一の localhost プロキシに制限されます。The middleware is configured to forward the X-Forwarded-For and X-Forwarded-Proto headers and is restricted to a single localhost proxy. 追加の構成が必要な場合は、「Forwarded Headers Middleware のオプション」をご覧ください。If additional configuration is required, see the Forwarded Headers Middleware options.

プロキシ サーバーとロード バランサーの他のシナリオOther proxy server and load balancer scenarios

IIS Integration Middleware が使われていない場合は、Forwarded Headers Middleware は既定では有効になりません。Outside of using IIS Integration Middleware, Forwarded Headers Middleware isn't enabled by default. UseForwardedHeaders を含む転送されたヘッダーをアプリで処理するためには、Forwarded Headers Middleware を有効にする必要があります。Forwarded Headers Middleware must be enabled for an app to process forwarded headers with UseForwardedHeaders. ミドルウェアを有効にした後、ミドルウェアに対して ForwardedHeadersOptions が指定されていない場合の既定の ForwardedHeadersOptions.ForwardedHeadersForwardedHeaders.None です。After enabling the middleware if no ForwardedHeadersOptions are specified to the middleware, the default ForwardedHeadersOptions.ForwardedHeaders are ForwardedHeaders.None.

Startup.ConfigureServices において X-Forwarded-For ヘッダーと X-Forwarded-Proto ヘッダーを転送するには、ForwardedHeadersOptions を使ってミドルウェアを構成します。Configure the middleware with ForwardedHeadersOptions to forward the X-Forwarded-For and X-Forwarded-Proto headers in Startup.ConfigureServices. 他のミドルウェアを呼び出す前に、Startup.Configure 内で UseForwardedHeaders メソッドを呼び出します。Invoke the UseForwardedHeaders method in Startup.Configure before calling other middleware:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.Configure<ForwardedHeadersOptions>(options =>
    {
        options.ForwardedHeaders = 
            ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseForwardedHeaders();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();
    // In ASP.NET Core 1.x, replace the following line with: app.UseIdentity();
    app.UseAuthentication();
    app.UseMvc();
}

注意

ForwardedHeadersOptionsStartup.ConfigureServices において指定されていない場合、または UseForwardedHeaders(IApplicationBuilder, ForwardedHeadersOptions) を使って拡張メソッドに直接渡されない場合、転送される既定のヘッダーは ForwardedHeaders.None です。If no ForwardedHeadersOptions are specified in Startup.ConfigureServices or directly to the extension method with UseForwardedHeaders(IApplicationBuilder, ForwardedHeadersOptions), the default headers to forward are ForwardedHeaders.None. 転送するヘッダーで ForwardedHeadersOptions.ForwardedHeaders プロパティが構成されている必要があります。The ForwardedHeadersOptions.ForwardedHeaders property must be configured with the headers to forward.

Nginx の構成Nginx configuration

X-Forwarded-For および X-Forwarded-Proto ヘッダーを転送する場合は、Nginx 搭載の Linux で ASP.NET Core をホストする を参照してください。To forward the X-Forwarded-For and X-Forwarded-Proto headers, see Nginx 搭載の Linux で ASP.NET Core をホストする. 詳細については、「NGINX: Using the Forwarded header」 (NGINX: 転送されるヘッダーの使用) を参照してください。For more information, see NGINX: Using the Forwarded header.

Apache の構成Apache configuration

X-Forwarded-For は自動的に追加されます (「Apache Module mod_proxy: Reverse Proxy Request Headers」 (Apache モジュール mod_proxy: リバース プロキシがヘッダーを要求する) を参照)。X-Forwarded-For is added automatically (see Apache Module mod_proxy: Reverse Proxy Request Headers). X-Forwarded-Proto ヘッダーを転送する方法については、Apache 搭載の Linux で ASP.NET Core をホストする を参照してください。For information on how to forward the X-Forwarded-Proto header, see Apache 搭載の Linux で ASP.NET Core をホストする.

Forwarded Headers Middleware のオプションForwarded Headers Middleware options

ForwardedHeadersOptions は、Forwarded Headers Middleware の動作を制御します。ForwardedHeadersOptions control the behavior of the Forwarded Headers Middleware. 既定の値の変更例を次に示します。The following example changes the default values:

  • 転送されるヘッダーのエントリ数を 2 に制限します。Limit the number of entries in the forwarded headers to 2.
  • 127.0.10.1 の既知のプロキシ アドレスを追加します。Add a known proxy address of 127.0.10.1.
  • 転送されるヘッダーの名前を既定の X-Forwarded-For から X-Forwarded-For-My-Custom-Header-Name に変更します。Change the forwarded header name from the default X-Forwarded-For to X-Forwarded-For-My-Custom-Header-Name.
services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardLimit = 2;
    options.KnownProxies.Add(IPAddress.Parse("127.0.10.1"));
    options.ForwardedForHeaderName = "X-Forwarded-For-My-Custom-Header-Name";
});
オプションOption 説明Description
AllowedHostsAllowedHosts X-Forwarded-Host ヘッダーによるホストを指定した値に制限します。Restricts hosts by the X-Forwarded-Host header to the values provided.
  • 値は、大文字と小文字を無視して序数で比較されます。Values are compared using ordinal-ignore-case.
  • ポート番号は除外されている必要があります。Port numbers must be excluded.
  • リストが空の場合、すべてのホストが許可されます。If the list is empty, all hosts are allowed.
  • 最上位のワイルドカード * は、すべての空でないホストを許可します。A top-level wildcard * allows all non-empty hosts.
  • サブドメインのワイルドカードは許可されますが、ルート ドメインとは一致しません。Subdomain wildcards are permitted but don't match the root domain. たとえば、*.contoso.com はサブドメイン foo.contoso.com と一致しますが、ルート ドメイン contoso.com とは一致しません。For example, *.contoso.com matches the subdomain foo.contoso.com but not the root domain contoso.com.
  • Unicode のホスト名は許可されますが、一致のために Punycode に変換されます。Unicode host names are allowed but are converted to Punycode for matching.
  • IPv6 アドレスは境界の角かっこを含む必要があり、従来の形式 (例: [ABCD:EF01:2345:6789:ABCD:EF01:2345:6789]) になっている必要があります。IPv6 addresses must include bounding brackets and be in conventional form (for example, [ABCD:EF01:2345:6789:ABCD:EF01:2345:6789]). IPv6 アドレスは、異なる形式間で論理的な等価性を調べるために特別な大文字小文字にはされず、正規化は行われません。IPv6 addresses aren't special-cased to check for logical equality between different formats, and no canonicalization is performed.
  • 許可されるホストの制限に失敗すると、サービスによって生成されたリンクを攻撃者が偽装する可能性があります。Failure to restrict the allowed hosts may allow an attacker to spoof links generated by the service.
既定の値は、空の IList<string> です。The default value is an empty IList<string>.
ForwardedForHeaderNameForwardedForHeaderName ForwardedHeadersDefaults.XForwardedForHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XForwardedForHeaderName. このオプションは、プロキシ/フォワーダーが X-Forwarded-For ヘッダーを使用していないが、情報の転送のためにその他のヘッダーを使用している場合に使用されます。This option is used when the proxy/forwarder doesn't use the X-Forwarded-For header but uses some other header to forward the information.

既定値は、X-Forwarded-For です。The default is X-Forwarded-For.
ForwardedHeadersForwardedHeaders 処理する必要があるフォワーダーを識別します。Identifies which forwarders should be processed. 適用されるフィールドの一覧については、「ForwardedHeaders Enum」(ForwardedHeaders 列挙型) をご覧ください。See the ForwardedHeaders Enum for the list of fields that apply. このプロパティに割り当てられる標準値は、ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto です。Typical values assigned to this property are ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto.

既定値は ForwardedHeaders.None です。The default value is ForwardedHeaders.None.
ForwardedHostHeaderNameForwardedHostHeaderName ForwardedHeadersDefaults.XForwardedHostHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XForwardedHostHeaderName. このオプションは、プロキシ/フォワーダーが X-Forwarded-Host ヘッダーを使用していないが、情報の転送のためにその他のヘッダーを使用している場合に使用されます。This option is used when the proxy/forwarder doesn't use the X-Forwarded-Host header but uses some other header to forward the information.

既定値は、X-Forwarded-Host です。The default is X-Forwarded-Host.
ForwardedProtoHeaderNameForwardedProtoHeaderName ForwardedHeadersDefaults.XForwardedProtoHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XForwardedProtoHeaderName. このオプションは、プロキシ/フォワーダーが X-Forwarded-Proto ヘッダーを使用していないが、情報の転送のためにその他のヘッダーを使用している場合に使用されます。This option is used when the proxy/forwarder doesn't use the X-Forwarded-Proto header but uses some other header to forward the information.

既定値は、X-Forwarded-Proto です。The default is X-Forwarded-Proto.
ForwardLimitForwardLimit 処理されるヘッダー内のエントリの数を制限します。Limits the number of entries in the headers that are processed. 制限を無効にするには null に設定しますが、これは KnownProxies または KnownNetworks が構成されている場合にのみ行う必要があります。Set to null to disable the limit, but this should only be done if KnownProxies or KnownNetworks are configured.

既定値は 1 です。The default is 1.
KnownNetworksKnownNetworks 受け付けるヘッダーの転送元である既知のプロキシのアドレス範囲です。Address ranges of known proxies to accept forwarded headers from. クラスレス ドメイン間ルーティング (CIDR) の表記を使って、IP の範囲を指定します。Provide IP ranges using Classless Interdomain Routing (CIDR) notation.

既定値は、IPAddress.Loopback に対する単一のエントリを含む IList<IPNetwork> です。The default is an IList<IPNetwork> containing a single entry for IPAddress.Loopback.
KnownProxiesKnownProxies 受け付けるヘッダーの転送元である既知のプロキシのアドレスです。Addresses of known proxies to accept forwarded headers from. IP アドレスの正確な一致を指定するには、KnownProxies を使います。Use KnownProxies to specify exact IP address matches.

既定値は、IPAddress.IPv6Loopback に対する単一のエントリを含む IList<IPAddress> です。The default is an IList<IPAddress> containing a single entry for IPAddress.IPv6Loopback.
OriginalForHeaderNameOriginalForHeaderName ForwardedHeadersDefaults.XOriginalForHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XOriginalForHeaderName.

既定値は、X-Original-For です。The default is X-Original-For.
OriginalHostHeaderNameOriginalHostHeaderName ForwardedHeadersDefaults.XOriginalHostHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XOriginalHostHeaderName.

既定値は、X-Original-Host です。The default is X-Original-Host.
OriginalProtoHeaderNameOriginalProtoHeaderName ForwardedHeadersDefaults.XOriginalProtoHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XOriginalProtoHeaderName.

既定値は、X-Original-Proto です。The default is X-Original-Proto.
RequireHeaderSymmetryRequireHeaderSymmetry 処理対象の ForwardedHeadersOptions.ForwardedHeaders の間でヘッダー値の数が同期していることを要求します。Require the number of header values to be in sync between the ForwardedHeadersOptions.ForwardedHeaders being processed.

ASP.NET Core 1.x での既定値は true です。The default in ASP.NET Core 1.x is true. ASP.NET Core 2.0 以降での既定値は false です。The default in ASP.NET Core 2.0 or later is false.
オプションOption 説明Description
ForwardedForHeaderNameForwardedForHeaderName ForwardedHeadersDefaults.XForwardedForHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XForwardedForHeaderName. このオプションは、プロキシ/フォワーダーが X-Forwarded-For ヘッダーを使用していないが、情報の転送のためにその他のヘッダーを使用している場合に使用されます。This option is used when the proxy/forwarder doesn't use the X-Forwarded-For header but uses some other header to forward the information.

既定値は、X-Forwarded-For です。The default is X-Forwarded-For.
ForwardedHeadersForwardedHeaders 処理する必要があるフォワーダーを識別します。Identifies which forwarders should be processed. 適用されるフィールドの一覧については、「ForwardedHeaders Enum」(ForwardedHeaders 列挙型) をご覧ください。See the ForwardedHeaders Enum for the list of fields that apply. このプロパティに割り当てられる標準値は、ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto です。Typical values assigned to this property are ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto.

既定値は ForwardedHeaders.None です。The default value is ForwardedHeaders.None.
ForwardedHostHeaderNameForwardedHostHeaderName ForwardedHeadersDefaults.XForwardedHostHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XForwardedHostHeaderName. このオプションは、プロキシ/フォワーダーが X-Forwarded-Host ヘッダーを使用していないが、情報の転送のためにその他のヘッダーを使用している場合に使用されます。This option is used when the proxy/forwarder doesn't use the X-Forwarded-Host header but uses some other header to forward the information.

既定値は、X-Forwarded-Host です。The default is X-Forwarded-Host.
ForwardedProtoHeaderNameForwardedProtoHeaderName ForwardedHeadersDefaults.XForwardedProtoHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XForwardedProtoHeaderName. このオプションは、プロキシ/フォワーダーが X-Forwarded-Proto ヘッダーを使用していないが、情報の転送のためにその他のヘッダーを使用している場合に使用されます。This option is used when the proxy/forwarder doesn't use the X-Forwarded-Proto header but uses some other header to forward the information.

既定値は、X-Forwarded-Proto です。The default is X-Forwarded-Proto.
ForwardLimitForwardLimit 処理されるヘッダー内のエントリの数を制限します。Limits the number of entries in the headers that are processed. 制限を無効にするには null に設定しますが、これは KnownProxies または KnownNetworks が構成されている場合にのみ行う必要があります。Set to null to disable the limit, but this should only be done if KnownProxies or KnownNetworks are configured.

既定値は 1 です。The default is 1.
KnownNetworksKnownNetworks 受け付けるヘッダーの転送元である既知のプロキシのアドレス範囲です。Address ranges of known proxies to accept forwarded headers from. クラスレス ドメイン間ルーティング (CIDR) の表記を使って、IP の範囲を指定します。Provide IP ranges using Classless Interdomain Routing (CIDR) notation.

既定値は、IPAddress.Loopback に対する単一のエントリを含む IList<IPNetwork> です。The default is an IList<IPNetwork> containing a single entry for IPAddress.Loopback.
KnownProxiesKnownProxies 受け付けるヘッダーの転送元である既知のプロキシのアドレスです。Addresses of known proxies to accept forwarded headers from. IP アドレスの正確な一致を指定するには、KnownProxies を使います。Use KnownProxies to specify exact IP address matches.

既定値は、IPAddress.IPv6Loopback に対する単一のエントリを含む IList<IPAddress> です。The default is an IList<IPAddress> containing a single entry for IPAddress.IPv6Loopback.
OriginalForHeaderNameOriginalForHeaderName ForwardedHeadersDefaults.XOriginalForHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XOriginalForHeaderName.

既定値は、X-Original-For です。The default is X-Original-For.
OriginalHostHeaderNameOriginalHostHeaderName ForwardedHeadersDefaults.XOriginalHostHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XOriginalHostHeaderName.

既定値は、X-Original-Host です。The default is X-Original-Host.
OriginalProtoHeaderNameOriginalProtoHeaderName ForwardedHeadersDefaults.XOriginalProtoHeaderName によって指定されているヘッダーではなく、このプロパティによって指定されているヘッダーを使います。Use the header specified by this property instead of the one specified by ForwardedHeadersDefaults.XOriginalProtoHeaderName.

既定値は、X-Original-Proto です。The default is X-Original-Proto.
RequireHeaderSymmetryRequireHeaderSymmetry 処理対象の ForwardedHeadersOptions.ForwardedHeaders の間でヘッダー値の数が同期していることを要求します。Require the number of header values to be in sync between the ForwardedHeadersOptions.ForwardedHeaders being processed.

ASP.NET Core 1.x での既定値は true です。The default in ASP.NET Core 1.x is true. ASP.NET Core 2.0 以降での既定値は false です。The default in ASP.NET Core 2.0 or later is false.

シナリオとユース ケースScenarios and use cases

転送されるヘッダーを追加することができず、すべての要求が安全な場合When it isn't possible to add forwarded headers and all requests are secure

アプリにプロキシされる要求に、転送されるヘッダーを追加できない場合があります。In some cases, it might not be possible to add forwarded headers to the requests proxied to the app. すべてのパブリック外部要求が HTTPS を使うことをプロキシが強制している場合、すべての種類のミドルウェアを使う前に、Startup.Configure でスキームを手動で設定できます。If the proxy is enforcing that all public external requests are HTTPS, the scheme can be manually set in Startup.Configure before using any type of middleware:

app.Use((context, next) =>
{
    context.Request.Scheme = "https";
    return next();
});

このコードは、開発環境またはステージング環境の環境変数または他の構成設定によって、無効にすることができます。This code can be disabled with an environment variable or other configuration setting in a development or staging environment.

要求のパスを変更するパス ベースとプロキシを処理するDeal with path base and proxies that change the request path

一部のプロキシでは、パスはそのまま渡されますが、ルーティングが正しく機能するためには削除する必要のあるアプリ ベース パスが含まれます。Some proxies pass the path intact but with an app base path that should be removed so that routing works properly. UsePathBaseExtensions.UsePathBase ミドルウェアは、パスを HttpRequest.PathHttpRequest.PathBase へのアプリ ベース パスに分割します。UsePathBaseExtensions.UsePathBase middleware splits the path into HttpRequest.Path and the app base path into HttpRequest.PathBase.

/foo/foo/api/1 として渡されるプロキシ パスのアプリ ベース パスである場合、ミドルウェアは次のコマンドで Request.PathBase/fooに、Request.Path/api/1 に設定します。If /foo is the app base path for a proxy path passed as /foo/api/1, the middleware sets Request.PathBase to /foo and Request.Path to /api/1 with the following command:

app.UsePathBase("/foo");

ミドルウェアが逆方向にもう一度呼び出されると、元のパスとパス ベースが再度適用されます。The original path and path base are reapplied when the middleware is called again in reverse. ミドルウェアの処理の順序について詳しくは、ASP.NET Core のミドルウェア を参照してください。For more information on middleware order processing, see ASP.NET Core のミドルウェア.

プロキシがパスをトリミングする場合は (たとえば、/foo/api/1/api/1 に転送)、要求の PathBase プロパティを設定することによって、リダイレクトとリンクを修正します。If the proxy trims the path (for example, forwarding /foo/api/1 to /api/1), fix redirects and links by setting the request's PathBase property:

app.Use((context, next) =>
{
    context.Request.PathBase = new PathString("/foo");
    return next();
});

プロキシがパス データを追加している場合は、StartsWithSegments(PathString, PathString) を使用して Path プロパティに割り当てることで、パスの一部を破棄してリダイレクトとリンクを修正します。If the proxy is adding path data, discard part of the path to fix redirects and links by using StartsWithSegments(PathString, PathString) and assigning to the Path property:

app.Use((context, next) =>
{
    if (context.Request.Path.StartsWithSegments("/foo", out var remainder))
    {
        context.Request.Path = remainder;
    }

    return next();
});

別のヘッダー名を使用するプロキシの構成Configuration for a proxy that uses different header names

プロキシがプロキシ アドレス/ポートおよび開始スキーム情報の転送に名前が X-Forwarded-ForX-Forwarded-Proto のヘッダーを使用しない場合、プロキシで使用されるヘッダー名と一致するように、ForwardedForHeaderNameForwardedProtoHeaderName のオプションを設定してください。If the proxy doesn't use headers named X-Forwarded-For and X-Forwarded-Proto to forward the proxy address/port and originating scheme information, set the ForwardedForHeaderName and ForwardedProtoHeaderName options to match the header names used by the proxy:

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";
});

トラブルシューティングTroubleshoot

ヘッダーが意図したとおりに転送されない場合は、ログ を有効にします。When headers aren't forwarded as expected, enable logging. ログで問題のトラブルシューティングに十分な情報が提供されない場合は、サーバーが受信した要求ヘッダーを列挙します。If the logs don't provide sufficient information to troubleshoot the problem, enumerate the request headers received by the server. ヘッダーは、インライン ミドルウェアを使ってアプリの応答に書き込むことができます。The headers can be written to an app response using inline middleware:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerfactory)
{
    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}");
    });
}

サーバーが予期される値を持つ X-Forwarded-* ヘッダーを受け取ることを確認します。Ensure that the X-Forwarded-* headers are received by the server with the expected values. 特定のヘッダーに複数の値がある場合、Forwarded Headers Middleware は右から左の逆の順序でヘッダーを処理することに注意してください。If there are multiple values in a given header, note Forwarded Headers Middleware processes headers in reverse order from right to left.

X-Forwarded-For が処理される前に、要求の元のリモート IP アドレスが KnownProxies リストまたは KnownNetworks リストのエントリと一致する必要があります。The request's original remote IP must match an entry in the KnownProxies or KnownNetworks lists before X-Forwarded-For is processed. これにより、信頼されないプロキシからの転送を受け付けないことで、ヘッダーのスプーフィングを制限します。This limits header spoofing by not accepting forwarders from untrusted proxies.

その他の技術情報Additional resources