ASP.NET Core MVC - グローバルフィルタで認証

グローバルフィルタを使って認証を必要とする方法です。認証を必要とするというかアクセス制御するというか。

ウェブアプリのうちログインを必要とする部分が多くてログイン不要な部分が少ない場合、グローバルフィルタで全体を制御しつつ、ログインなしで利用したいコントローラ・アクションにAllowAnonymous属性をつけると手堅いかなと思います。

Core MVCでは、ConfigureServicesメソッド内でAddMvcメソッドを使ってサービスを追加するときに、AuthorizeFilterを作成してMvcOptions.Filtersに追加すればいいみたいです。

public class Startup {
    public void ConfigureServices(IServiceCollection services) {
        // クッキー認証を行うためにサービスを登録
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie();

        services.AddMvc(options => {
            // ウェブアプリ全体で認証を必要にするため、グローバルフィルタに追加
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        });
    }
}

CoreではないMVCとかなり違ったので悩みました。たぶんこれでいいはず。

参考