【ASP.NET Core Web】クッキー認証とJWT認証を併用する

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【ASP.NET Core Web】クッキー認証とJWT認証を併用する

2024-4-5 |

.NET 8のASP.NET Core Webでクッキー認証とJWT認証を併用したい!どちらかで認証してればログインできるみたいな!

概要

今回の記事では、.NET 8のASP.NET Core Webでクッキー認証とJWT認証を併用して、どちらかで認証してればログインできるようにする手順を掲載する。

WEBサーバーへの認証でよく使われるクッキー認証とAPIサーバーへの認証でよく使われるJWT認証を一つのASP.NET Core Webのアプリに実装して、どちらかで認証してればログインできるようする必要があった。非力なサーバーで動かす予定なので、稼働させるプロセスを増やしたくなかった感じ。

将来的にはWEBサーバーとAPIサーバー、DBサーバーと分ける予定なんだけども、一旦今は同じサーバーで動かしたい!

仕様書

環境

  • .NET 8.0

手順書

ASP.NET Core Webでクッキー認証とJWT認証を併用して、どちらかで認証してればログインできるようにするには、認証のポリシーを作って、コントローラー等にポリシーを設定する必要がある。

アプリの設定とポリシー作成の要点を抜粋したコード。

namespace CookieOrJwtAuth
{
    public class Program
    {
        public static void Main(string[] args)
        {
            ...
            builder.Services
                .AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                })
                .AddCookie(
                    CookieAuthenticationDefaults.AuthenticationScheme,
                    options =>
                    {
                        ...
                    }
                )
                .AddJwtBearer(
                    JwtBearerDefaults.AuthenticationScheme,
                    options =>
                    {
                        ...
                    }
                );

            builder.Services.AddAuthorization(options =>
            {
                options.AddPolicy("CookieOrJwtPolicy", policy =>
                {
                    policy.AuthenticationSchemes.Add(CookieAuthenticationDefaults.AuthenticationScheme);
                    policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
                    policy.RequireAuthenticatedUser();
                });
                // デフォルトポリシーを設定すればコントローラー等で一つ一つポリシーの設定をしなく済むはずだったんだけども、現在のNET8.0の環境ではデフォルトポリシーの設定が効かない模様。
                options.DefaultPolicy = options.GetPolicy("CookieOrJwtPolicy");
            });
        }

        ...
    }
}

コントローラーに先ほど作ったポリシーを設定する例。

namespace CookieOrJwtAuth.Controllers
{
    [Authorize(Policy = "CookieOrJwtPolicy")]
    public class AuthController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

        ...
    }
}

各コントローラーにポリシーを設定するのが面倒なんだけども、コメントに書いたとおり.NET8.0ではデフォルトポリシーの設定が効かない。

まとめ(感想文)

これでブラウザでアクセスした時にはクッキー認証、別のアプリとかでAPIを呼び出す時にはJWT認証みたいなことができるようになった。(良い悪いはひとまずおいておいて)