【ASP.NET(C#)3】.NET 6でMVCのログイン認証を作成。Core 3.1との違いも解説

今までのASP.NETの記事は.NET Core 3.1で作っていましたが今回からVisual Stdio 2022 Communityを使った.NET 6 を使用してアプリを作成していきたいと思います。

さて、前回はASP.NETを使ってCRUDを作成する所までやりました。今回は前回行えなかったスキャフォールディングを使ったCRUDのやり方最低限の変更でCookie認証(昔で言うフォーム認証)を使ったCRUDを制御を行えるようになりましたので共有します。

ちなみに.NET 6 はVisual Studio 2022をインストールすると標準で入っていますが、2019までのバージョンで入れたい場合はSDKをインストール後、直接.csprojを書き換えなければいけません。

Nugetパッケージでは普通に.NET 6のバージョンがインストールできるので2019でも.NET 6 を使った開発はできますが、これから新規にWebアプリケーションを作りたい場合は実務でも個人でも2022を使った方が良いと思います。かなりの便利機能もあります。

ASP.NET Core MVCのプロジェクトを作成

最初の選択でMVCにします。

追加情報の認証の種類は「なし」にしてください。

認証の種類の「個別のアカウント」はIdentity を使用したログイン方式になります。ASP.NET Core の Identity の概要を参照ください。かなり高度なユーザ情報にて専用のテンプレートを用いた認証になりますが、ログイン画面が用意されたものになりますので変更できません。

「Microsoft ID プラットフォーム」はおそらくMicrosoftのサインイン情報を使ったログインだと思います。
「Windows認証」は自身のコンピュータとしてのログインになります。

「Cookie認証(旧フォーム認証)」Identity なしでの Cookie 認証の使用を参照して自分で組み立てます。フォーム画面のデザインも自由なので単純にユーザ/パスワードだけで制御するなら十分でしょう。他二つはフォームでログインする方式でないので今回はこちらを採用します。

.NET Core 3.1 と .NET 6 で大きく変わった所

startup.csがなくなった

画面にあるようにstartup.csがなくなってます。公式でもアナウンスされています。(日本語バージョンがなし) 今回はその公式ページを一部引用させて頂きます。

Web app template improvements

The web app templates:

Use the new minimal hosting model.

Significantly reduces the number of files and lines of code required to create an app. For example, the ASP.NET Core empty web app creates one C# file with four lines of code and is a complete app.

Unifies Startup.cs and Program.cs into a single Program.cs file.

Uses top-level statements to minimize the code required for an app.

Uses global using directives to eliminate or minimize the number of using statement lines required.

6.0 の新機能

この赤マーカーの一文は翻訳すると

Startup.csとProgram.csを単一のProgram.csファイルに統合します。

になります。.NET Core 3.1 からだと馴染みが薄いですが.NET 6 の場合は仕様のようですので慣れましょう。

コーディング自動保管機能(IntelliCode)

これは.NET 6 というよりVS2022の機能ですがModelsでテーブルをコーティングしようとする時、アプリケーションが次の文字を予測してくれて、Tabを押すと自動入力してくれる機能が追加されました。 IntelliCode と呼ぶみたいです。

Visual Studio 用 IntelliCode の概要

かなりの便利機能なのでこれだけでもVS2022に切り替える価値があるのでは?と思います。

スキャフォールディング

.NET 6 でのスキャフォールディングを行う方法は非常に簡単です。

公式サイトのパート 4、ASP.NET Core MVC アプリにモデルを追加するをご参照ください。

書いてある通りの操作で簡単にModels,View,Controllerができてしまいます

この公式ドキュメントにはその後のMigrationの説明もありますが、Migrationの解説は前回記事でも行っているのでここでは割愛させて頂きます。関連記事リンク先→SQLSERVERにテーブルとデータを挿入する参照

認証機能の実装

いよいよここからは本題である認証機能を実装します。尚、今回は過去記事等であらかじめ基本のCRUDは行えており、Razorついて前提してお話を進めますのでご了承ください。

実装するにあたって今回は二つの記事を参考にさせて頂いてます。

Identity なしでの Cookie 認証の使用

ASP.NET Core Identity を使わない認証

この二つの記事を踏まえて以下のソースを変更しました。基本は2番目の記事そのままで実装できましたので二つの記事との差分を記載したいと思います。

program.cs

builder.Services.AddAuthentication("MyCookieAuthenticationScheme")
    .AddCookie("MyCookieAuthenticationScheme", options =>
    {
        options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
        options.SlidingExpiration = true;
        options.AccessDeniedPath = "/Forbidden/";
    });

これはデフォルトのスキーマの指定( CookieAuthenticationDefaults.AuthenticationScheme )だとうまくいかなかったので今は直接固定文字列を入れています。こちらを CookieAuthenticationDefaults.AuthenticationScheme にしたい場合は、program.csだけでなく、参照先サイトで指定していた“MyCookieAuthenticationScheme”の部分も CookieAuthenticationDefaults.AuthenticationScheme に修正してしまえば問題ありません。

Views/Article(CRUD対象のものでOK)/Index.cshtml

        <td>
            <a asp-action="Details" asp-route-id="@item.Id">Details</a> |

            @if (User.Identity.IsAuthenticated)
            {
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a>
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            }
        </td>

記事の変更と削除の所にログイン中を示す、User.Identity.IsAuthenticatedを指定しています。

実際の画面(未ログイン)

これはログインしていない状態です。書き込みの一覧がありますが右下のボタンはDetails(詳細)のみがあって、変更と削除が表示されていないですよね?ログインしていないユーザは「新規書き込み」「詳細を表示」だけが行えることになります。

実際の画面(ログイン済)

こちらはログイン状態です。ログインしていると右上の表示が「ログアウト」になり、編集・削除も自由に行えるようになります。

ちなみにログイン情報はCookieに保持されるのでログイン状態でアプリを終了し、もう一度起動してもログイン状態はちゃんと保持されています

以上で簡単な認証機能の実装を終わります。

.NET FrameworkとCoreで認証方法が異なるっぽい

こちらは前回も記事にさせて頂いた下記紹介の学習動画の評価記事です。

上記記事であげた ASP.NET Coreで認証・認可するには? ですがやはりこの認証方法は.NET Framework独自のもののようです。

.NET Framework

メンバーシップ フレームワークによる認証機能の実装 (前編)

この記事は最新が.NET Framework 4.6 です。と言っているくらいの古い記事なのですが、認証に関する処理はやはり動画と同じくMemberShipProvider/RoleProviderを使って行っているようです。

.NET Core

.NET Core MVCの場合は今のところ先ほどリンクを貼ったサイトのような実装でCookie認証を作るしかなく、Roleを設定する方法はどこにも載っていないので詳細は不明です。

RoleはUser/Passとは別にRoleのエリアをきちんと自分で定義→参照すれば同等のシステムは作成可能です。
ただ、それが必要な程のシステムを作るならASP.NET Core Identity のシステムに乗っ取った認証の実装をした方がベターだと思います。今回は Identity による実装は行わないので解説は割愛させて頂きます。

まとめ

RoleProviderに関しては.NET Coreになって扱いがどうなったかは公式サイトに見つからなかったのでまだ腑に落ちない感はありましたが、やっと認証を実装することができました。

Cookie認証に関してはもう少し詳細に調べる必要はありますし、まだアカウントとパスワードをDB保存していませんががなんとか認証機能がクリアになったので後は見栄え/構成部分になってくると思います。

それに伴って今度はフロントエンド側の記事もあげられるといいなぁと思います。それでは!