情報応用演習Ⅰ(2024)

【T9a】簡易ブログソフトウェアの作成 Part.Ⅰ ~ 認証機能の組み込み(8/14)

プロジェクトタイプASP.NET Core Web アプリ(Model-View-Controller)
プロジェクト名T9a
ソリューション名PIT9
ターゲットフレームワーク.NET 8.0(長期的なサポート)
最上位レベルのステートメントを使用しない使用する(チェックオフ)
注意
  • 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
    • 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
    • プロジェクトの作成作業については準備作業を参照せよ.

9a-8. アカウント管理用コントローラーの準備

以降の処理ではサインインの失敗やアカウント操作の失敗に関する失敗とみなす実行パスが複雑になるため, 専用の例外クラスを定義して使用することにする.プロジェクトを右クリックして「追加」→「クラス」をクリックしよう. 作成するクラス名を訊かれるのでCompositeMessagesException(.csは省略可能)と入力して「追加」ボタンをクリックしよう. CompositeMessagesException.cs を_に示すように編集して1つの抽象例外クラスと,それを継承した 2つの例外クラスを定義する.

専用の例外クラス
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using Microsoft.AspNetCore.Identity; // 追記

namespace T9a
{
    // 複合メッセージをもつ抽象例外クラス
    public abstract class CompositeMessagesException : Exception
    {
        public abstract IEnumerable<string> ErrorMessages { get; }
    }

    // サインインに関する例外クラス
    public class SignInOperationException : CompositeMessagesException
    {
        public SignInResult Result { get; }

        public SignInOperationException(SignInResult res)
        {
            Result = res;
        }

        public override IEnumerable<string> ErrorMessages
        {
            get
            {
                if (!Result.Succeeded)
                {
                    yield return "ログインに失敗しました.";
                    if (Result.IsLockedOut)
                        yield return "ロックアウトされています.";
                    if (Result.IsNotAllowed)
                        yield return "許可されていません";
                    if (Result.RequiresTwoFactor)
                        yield return "二要素認証が必要です.";
                }
            }
        }
    }

    // アカウント操作に関する例外クラス
    public class IdentityOperationFailedException : CompositeMessagesException
    {
        public IdentityResult Result { get; }
        public IdentityOperationFailedException(IdentityResult res)
        {
            Result = res;
        }
        public override string Message => string.Join(", ", ErrorMessages);
        public override IEnumerable<string> ErrorMessages => from e in Result.Errors select e.Description;
    }
}

また前章と同じようにログイン画面の入力値のためのモデルクラスLoginUserInfoクラスを追加しておく. プロジェクト内の Models フォルダを右クリックし,「追加」→「クラス」をクリックする. 作成するクラス名を訊かれるのでLoginUserInfo(.csは省略可能)と入力して「追加」ボタンをクリックする. すると空のクラス定義が作られるので_の定義を書き込もう.

LoginUserInfoクラス
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
using System.ComponentModel.DataAnnotations; // 追記

namespace T9a.Models
{
    // ログイン画面のためのモデルクラス
    public class LoginUserInfo
    {
        [Display(Name = "ユーザー名")]
        public string Username { get; set; } = "";

        [Display(Name = "パスワード")]
        [DataType(DataType.Password)]
        public string Password { get; set; } = "";
    }
}
Last updated on 2024-06-19
Published on 2024-06-19

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.