ASP.NET Coreを特にLinuxなどで動かす場合、Kestrelを使うことが多いのですが、Kestrel自体はシンプルなサーバーなのでフロントにHAProxyやnginxなどのプロキシーサーバーを配置することが多くなります。さらにHTTPSでアクセスするようにする場合、証明書はKestrel側ではなくてプロキシサーバー側に配置して、プロキシサーバーからKestrelまでは(プライベートネットワークだし)HTTPで通信するケースもあるかと思います。その場合、ASP.NET Core側でRequest.Scheme*1はhttpになります。これをhttpsにしたい場合のお話です。
OpenID ConnectやAzure AD B2Cなどの認証などのために、リクエストをリダイレクトする場合、ユーザーがアプリにリクエストしたURLを基にcallbackするURLを生成するため、Request.Schemeが使われます。このとき、リバースプロキシ経由でHTTPリクエストをKestrelが受信している場合、当然のごとくRequest.Schemeはhttpになります。

認証サーバーに認証後にCallbackするURLも一緒に渡し場合、Request.Schemeを基にURLを構築している場合*2このURLがhttpになります。認証サービスプロバイダー側がこれを許可していれば別ですが、例えばAzure AD B2Cの場合httpsでないと許可されないため動きません。他にもうまくいかないプロバイダーや認証以外のサービスもあると思います。そこで、ASP.NET Core側にhttpsでユーザーからリクエストは送信されて、リバースプロキシ経由でhttpになっていることを伝える必要がでてきます。
実はこの設定については、タイトルがnginxなので自分はすっかり読み飛ばしていたのですが、ASP.NET Coreのドキュメントにも載っています。
まず前提条件として、リバースプロキシサーバーがHTTPリクエストをKestrelに送信する場合に、X-Forwarded-ProtoというHTTPヘッダーにオリジナルのリクエストのプロトコルを値にしたヘッダーを追加している必要があります。多くの場合、X-Forwarded-Forと併せて設定されているのではないかと思います。
この条件のもと次のようなミドルウェアを追加するコードをStartupクラスのConfigureメソッドに記述します。認証サービスで利用する場合は、サンプルのようにUseAuthenticationメソッドの前に記述する必要があります。
//using using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.HttpOverrides; // app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto }); app.UseAuthentication();
このメソッドはMicrosoft.AspNetCore.HttpOverridesというNuGetライブラリで提供されていますが、Microsoft.AspNetCore.Allが依存しているのでこれを参照している場合は明示的に追加する必要はありません。
これでこのミドルウェアを通った後は、HTTPヘッダーからX-Forwarded-Protoがなくなり、Request.Schemeがhttpsを返すようになるのでめでたし、ということになります。