ログイン認証を考える
ASP.NET Core MVCのログイン認証はどうするのか?調べた結果、いろいろあるっぽい。
.NET Core MVC における認証認可システム選定の経緯とその戦い(現状、ほぼリンク集)
Identity追加で済ますのが簡単ではあるが、View以外がブラックボックスみたいでどんな処理をしているのかが見えなかった。コントローラーもモデルも見当たらない。まぁフレームワーク側で適切な処理をしてるのだろうけど。
【追記】RazorPageで作られたCSファイルがあり、ここに処理が書いてありました。
もっと簡単にユーザー名とパスワードでログイン処理したい場合は、クッキー認証を使うらしい。こちらはコントローラー等を自前で実装。
【ASP.NET(C#)3】.NET 6でMVCのログイン認証を作成。Core 3.1との違いも解説 – イナコーシステム
ASP.NET Core Identity を使わない認証 – へっぽこプログラマーの備忘録
ASP.NET Core Identity を使用せずに cookie 認証を使用する | Microsoft Learn
Cookie 認証 を使用してログインしないとリダイレクトされる仕組みを作る – ASP.NET Core – ソーサリーフォース
Program.cs
builder.Services.AddAuthentication("MyCookieAuthenticationScheme").AddCookie("MyCookieAuthenticationScheme", options =>
{
options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
options.SlidingExpiration = true;
// アクセスが禁止されているリソースにアクセスしようとしたときにリダイレクトするパス
options.AccessDeniedPath = "/Account/Login/";
// 認証されていないユーザーがリソースにアクセスしようとしたときにリダイレクトするパス
options.LoginPath = "/Account/Login/";
});
AccountController.cs
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication;
namespace AuthSample3.Controllers
{
public class AccountController : Controller
{
List users = new List
{
new ApplicationUser{UserName = "hoge", Password = "1234"},
new ApplicationUser{UserName = "piyo", Password = "5678"}
};
public IActionResult Login()
{
return View();
}
[HttpPost]
[AutoValidateAntiforgeryToken]
public async Task Login(ApplicationUser user, string returnUrl = null)
{
const string badUserNameOrPasswordMessage = "ユーザー名かパスワードが違います";
if (user == null)
{
return BadRequest(badUserNameOrPasswordMessage);
}
// ユーザー名が一致するユーザーを抽出
var lookupUser = users.Where(u => u.UserName == user.UserName).FirstOrDefault();
if (lookupUser == null)
{
return BadRequest(badUserNameOrPasswordMessage);
}
// パスワードの比較
if (lookupUser?.Password != user.Password)
{
return BadRequest(badUserNameOrPasswordMessage);
}
// Cookies 認証スキームで新しい ClaimsIdentity を作成し、ユーザー名を追加します。
var identity = new ClaimsIdentity("MyCookieAuthenticationScheme");
identity.AddClaim(new Claim(ClaimTypes.Name, lookupUser.UserName));
await HttpContext.SignInAsync("MyCookieAuthenticationScheme", new ClaimsPrincipal(identity));
return RedirectToAction(nameof(HomeController.Index), "Home");
}
public async Task Logout()
{
await HttpContext.SignOutAsync("MyCookieAuthenticationScheme");
return RedirectToAction("Index", "Home");
}
}
}
ログイン、ログアウトのViewを作ればOK。
あとは認証するコントローラーやアクションに
[Authorize]
を入れて認証する。