概要
VisualStudioのASP.NET Core2.1 Identityテンプレートを極力流用しつつサービスを作成したとします。
テンプレートには、Register(ユーザー登録)のサンプルも付属しておりDBの中に、どのような情報が登録されるのか確認することができます。
しかし、インターネットに公開されているページで、自由にアカウント登録させるのは、困るサービスもあると思います。
本記事は、アカウントの新規登録を制限する方法についての記事です。
私が独自に見つけた方法なので、もっとスマートな方法があるかも知れません。
コメントで、ご指摘頂けますと助かります。
ASP.NET Core Identityとは
ASP.NET Core Identityは、読んで字のごとく、ASP.NET Coreで、ユーザーのアカウント情報を管理するライブラリです。
かなり多機能なライブラリで、使いこなす事ができれば、世の中のたいていのパターンの認証方法は実現できそうです。
ただ、ASP.NET Core自体が、未成熟なためかバージョンによって、記述方法が変わります。
私は、2.1が、LTSなこともあって、2.2へは移行していません。
ヘッダーのリンクを削除する
テンプレートを見て、まず思いついたのは、_LoginPartial.cshtmlのリンクを削除することです。
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
@if (SignInManager.IsSignedIn(User))
{
<form asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })" method="post" id="logoutForm" class="navbar-right">
<ul class="nav navbar-nav navbar-right">
<li>
<a asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
</li>
<li>
<button type="submit" class="btn btn-link navbar-btn navbar-link">Logout</button>
</li>
</ul>
</form>
}
else
{
<ul class="nav navbar-nav navbar-right">
<li><a asp-area="Identity" asp-page="/Account/Register">Register</a></li>
<li><a asp-area="Identity" asp-page="/Account/Login">Login</a></li>
</ul>
}
ログイン中かを判断して、RegisterとLoginへのページリンクが、表示される仕組みになっています。
リンクを削除すれば、とりあえずアカウント登録画面を表示することは、できなくはなります。
しかし、リンクのURLを知っていたらどうでしょうか?
https://localhost:44326/Identity/Account/Register
リンクを直接入力すれば、いとも簡単に、アカウント登録画面は表示されてしまいます。
ページを上書きする
ソリューションに、Areas/Identity/Pagesというフォルダがあると思います。
フォルダの中に、Accountというフォルダを作成して、Register.cshtmlというページを作成します。
@page
@model UserRegist.Areas.Identity.Pages.Account.RegisterModel
@{
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace UserRegist.Areas.Identity.Pages.Account
{
public class RegisterModel : PageModel
{
public void OnGet()
{
}
}
}
ページの中身は、空っぽです。
この意味のないページを作成しておくことで、直リンクで開かれてもアカウント作成機能を無効化することができます。
今回は、機能の無効化目的で、ページを作成しましたが、アカウント登録画面のカスタマイズ目的で、利用することも可能です。
スキャフォールディングを使ってコードを生成
この記事を書いたときには、サンプルコードとソースコードを見て、上書きするページを作成したのですが、スキャフォールディングという機能を使えば、コードを自動生成してくれる事が分かったので、追記します。
ASP.NET Core scaffolderをインストールします。
> dotnet tool install -g dotnet-aspnet-codegenerator
ログインページを生成します。
コマンドラインは、スタートアッププロジェクトのカレントディレクトリで実行してください。
エラーで止まる場合には、binとobjフォルダを削除してから実行すると動くこともあるようです。
> dotnet aspnet-codegenerator identity -dc Vue2Spa.Data.ApplicationDbContext --files "Account.Register"
生成されたコード(ページ)を編集すれば、登録画面をカスタマイズすることができます。