ASP.NET WebアプリにAuth0を設定する
概要
ASP.NET WebアプリにAuth0を設定する方法を調べた。Auth0を設定するとQuick Startに詳細な説明があり、基本的にはここだけでOK。今回は未認証時に飛ぶログインページのURLを少しいじりたかったので、調査した。
手順
-
Auth0の設定を行い、Domain、Client IDを取得する
-
「ASP.NET Core Webアプリ (Model-View-Controller)」テンプレートでプロジェクトを作成する
-
「Auth0.AspNetCore.Authentication」パッケージをNuGetから取得する
-
appsettings.jsonにAuth0用の設定を追加する
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
+ "Auth0": {
+ "Domain": "[Domain]",
+ "ClientId": "[Client ID]",
+ }
}
- 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"
を有効にするために必要となる。
- /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で設定したものを消すという意味合いだと思うが、そもそも論、これがダメなのかな・・?
- /Controllers/HomeController.csを編集する(認証が必要なページを作成する)
+ [Authorize]
public IActionResult Privacy()
{
return View();
}
- Auth0で受け入れるURLを設定する
サンプルコード
注意点
例えば /Privacy
に認証を付けたとして、未ログインの場合に強制的にログイン画面へ飛ばすのは既定では /Account/Login
となっている。今回は /Account/
をスキップしたかったので、少し色々と工夫が必要になった
参考文献
雑感
Auth0はとても簡単に使えるように工夫されていて感動した。これからは選択肢に入れようとおもった。prelogin scriptなどもあるようなので、これから少しずつ勉強する。
Discussion