ClaimsPrincipal.Current からの移行

ASP.NET 4.x プロジェクトでは、ClaimsPrincipal.Current を使用して、現在認証されているユーザーの ID と要求を取得することが一般的でした。 ASP.NET Core では、このプロパティは設定されません。 それに依存していたコードは更新し、現在認証されているユーザーの ID を別の手段で取得する必要があります。

静的状態ではなくコンテキスト固有状態

ASP.NET Core の使用時、ClaimsPrincipal.CurrentThread.CurrentPrincipal の両方の値が設定されません。 これらのプロパティはどちらも静的な状態を表し、ASP.NET Core では通常、避けられます。 代わりに、ASP.NET Core では依存関係の挿入 (DI) を使用し、現在のユーザーの ID など、依存関係を提供します。 テスト ID を簡単に挿入することができるので、DI から現在のユーザーの ID を取得することはテストとして適しています。

ASP.NET Core アプリで現在のユーザーを取得する

ClaimsPrincipal.Current の代わりに ASP.NET Core で現在のユーザーの ClaimsPrincipal を取得する方法がいくつかあります。

  • ControllerBase.User。 MVC コントローラーでは、User プロパティを使用し、現在認証されているユーザーにアクセスできます。

  • HttpContext.User。 現在の HttpContext (ミドルウェアなど) にアクセスできるコンポーネントでは、HttpContext.User から現在のユーザーの ClaimsPrincipal を取得できます。

  • 呼び出し元から渡される。 現在の HttpContext へのアクセスがないライブラリは多くの場合、コントローラーまたはミドルウェア コンポーネントから呼び出され、現在のユーザーの ID を引数として受け取ることができません。

  • IHttpContextAccessor。 ASP.NET Core に移行されているプロジェクトは大きすぎて現在のユーザーの ID を必要なすべての場所に簡単に渡せないことがあります。 そのような場合、IHttpContextAccessor を回避策として使用できます。 IHttpContextAccessor は (存在する場合) 現在の HttpContext にアクセスできます。 DI を使用している場合は、「ASP.NET Core の HttpContext へのアクセス」を参照してください。 ASP.NET Core の DI 駆動アーキテクチャを使用するようにまだ更新されていないコードで現在のユーザーの ID を取得する短期的解決策は次のようになります。

    • Startup.ConfigureServicesAddHttpContextAccessor を呼び出し、DI コンテナーで IHttpContextAccessor を利用できるようにします。
    • 起動時に IHttpContextAccessor のインスタンスを取得し、それを静的変数に格納します。 このインスタンスは、以前に静的プロパティから現在のユーザーを取得したコードで利用できます。
    • HttpContextAccessor.HttpContext?.User を利用して現在のユーザーの ClaimsPrincipal を取得する このコードが HTTP 要求のコンテキストを外れて使用されている場合、HttpContext は null です。

最後の方法は静的変数に格納されている IHttpContextAccessor インスタンスを使用することですが、それは、挿入された依存関係の方が静的依存関係より望ましいとする ASP.NET Core の原則に相反します。 代わりに、最終的に DI から IHttpContextAccessor インスタンスを取得する予定です。 ただし、ClaimsPrincipal.Current を使用する大型の既存 ASP.NET アプリを移行する場合、静的ヘルパーがブリッジとして役立つことがあります。