noxi雑記

.NET、Angularまわりの小ネタブログ

ASP\.NET Core 2.2でMVCルーティングの条件指定が効かなくなる場合がある

ASP .NET Core 2.2 では MVC ルーティングが Endpoint Routing となり、 特定の場合では破壊的変更になるそうです。この破壊的変更を見事に踏み抜いてしまったので書き置いておきます。

blog.shibayan.jp

筆者が開発に携わっているアプリケーションは ASP .NET Core の Angular テンプレートをベースとし、 WebAPI 兼 Angular SPA アプリケーションとして動作しています。 ApiController 群は RouteAttribute でルーティングを設定しているため、それ以外の存在しない URL は Angular へのアクセスとして扱う必要があり、Cookie 認証もかねて以下のように設定していました。

routes.MapRoute(
    name: "spa-auth-fallback",
    template: "{*url}",
    defaults: new { controller = "Home", action = "Index" },
    constraints: new
    {
        authorize = new HttpContextConstraint(context => !context.User.Identity.IsAuthenticated)
    });

HttpContextConstraint はアクセス中の HttpContext に対して条件を設定するために実装したクラスです。)

この条件は ASP .NET Core 2.1 だと意図したとおりに動きますが、 ASP .NET Core 2.2 へアップグレードすると全く反応しません。これを反応させるためには Endpoint Routing を OFF にする必要があります。 OFF にするには Startup.cs の ConfigureServicesAddMvc のオプションに対して設定を行います。

services
    .AddMvc(options =>
    {
        options.EnableEndpointRouting = false;
    })
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);