🦍

ASP.NET WebアプリにAuth0を設定する

2024/11/17に公開

概要

ASP.NET WebアプリにAuth0を設定する方法を調べた。Auth0を設定するとQuick Startに詳細な説明があり、基本的にはここだけでOK。今回は未認証時に飛ぶログインページのURLを少しいじりたかったので、調査した。

手順

  1. Auth0の設定を行い、Domain、Client IDを取得する

  2. 「ASP.NET Core Webアプリ (Model-View-Controller)」テンプレートでプロジェクトを作成する

  3. 「Auth0.AspNetCore.Authentication」パッケージをNuGetから取得する

  4. appsettings.jsonにAuth0用の設定を追加する

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
+ "Auth0": {
+   "Domain": "[Domain]",
+   "ClientId": "[Client ID]",
+ }
}
  1. Program.csを編集する
+ using Auth0.AspNetCore.Authentication;
+ using Microsoft.AspNetCore.Identity;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

+ builder.Services.AddAuth0WebAppAuthentication(options => {
+     options.CookieAuthenticationScheme = IdentityConstants.ApplicationScheme;
+     options.Domain = builder.Configuration["Auth0:Domain"];
+     options.ClientId = builder.Configuration["Auth0:ClientId"];
+ });
+ 
+ builder.Services.ConfigureApplicationCookie(options =>
+ {
+     options.LoginPath = "/login"; // ここでリダイレクトURLをカスタマイズ
+ });

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

options.CookieAuthenticationScheme = IdentityConstants.ApplicationScheme; はなくてもログイン自体はできるが、認証が必要なページに遷移した際に自動でログインページに遷移する設定である options.LoginPath = "/login" を有効にするために必要となる。

  1. /Controllers/AccountController.csを作成する
using Auth0.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;

namespace auth0_test.web.Controllers
{
    public class AccountController : Controller
    {
        [HttpGet("login")]
        public async Task Login(string returnUrl = "/")
        {
            var authenticationProperties = new LoginAuthenticationPropertiesBuilder()
                // Indicate here where Auth0 should redirect the user after a login.
                // Note that the resulting absolute Uri must be added to the
                // **Allowed Callback URLs** settings for the app.
                .WithRedirectUri(returnUrl)
                .Build();

            await HttpContext.ChallengeAsync(Auth0Constants.AuthenticationScheme, authenticationProperties);
        }

        [HttpGet("logout")]
        public async Task Logout()
        {
            var authenticationProperties = new LogoutAuthenticationPropertiesBuilder()
                // Indicate here where Auth0 should redirect the user after a logout.
                // Note that the resulting absolute Uri must be added to the
                // **Allowed Logout URLs** settings for the app.
                .WithRedirectUri(Url.Action("Index", "Home"))
                .Build();

            await HttpContext.SignOutAsync(Auth0Constants.AuthenticationScheme, authenticationProperties);
            //await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            await HttpContext.SignOutAsync(IdentityConstants.ApplicationScheme);
        }
    }
}

基本的にはAuth0のQuick Startのまま。ただし、logoutの最終行だけ違う。サンプル通りだとエラーになってしまうので、修正する。というかProgram.csで設定したものを消すという意味合いだと思うが、そもそも論、これがダメなのかな・・?

  1. /Controllers/HomeController.csを編集する(認証が必要なページを作成する)
+       [Authorize]
        public IActionResult Privacy()
        {
            return View();
        }
  1. Auth0で受け入れるURLを設定する

サンプルコード

注意点

例えば /Privacy に認証を付けたとして、未ログインの場合に強制的にログイン画面へ飛ばすのは既定では /Account/Login となっている。今回は /Account/ をスキップしたかったので、少し色々と工夫が必要になった

参考文献

雑感

Auth0はとても簡単に使えるように工夫されていて感動した。これからは選択肢に入れようとおもった。prelogin scriptなどもあるようなので、これから少しずつ勉強する。

Discussion