情報応用演習Ⅰ(2024)

【T8b】ASP.NET Core Identity の基礎(9/9)

プロジェクトタイプ(注意: 本文参照)
プロジェクト名T8b
ソリューション名PIT8
注意
  • 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
    • 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
    • プロジェクトの作成作業については準備作業を参照せよ.

8b-9. Adminコントローラーに対するアクセス制御の設定

それでは順番に設定していこう.Homeコントローラーは設定不要なので,まずはStudentsコントローラーに アクセス制御の設定を行おう.今回はすべて【方法$\alpha$】を用いて設定することにする. Studentsコントローラーは,表8b-8-2に示す通りIndexアクションとDetailsアクションのみ匿名アクセスを許可することにする. このことを実際にコード上で設定してみよう. Controllers/StudentsController.cs を_に示すように変更する. なお長くなるので_では各メソッドの内容は省略している.

また,[Authorize]属性や[AllowAnonymous]属性はMicrosoft.AspNetCore.Authorization名前空間で定義されているので, .cs ファイルの冒頭に_に示すusingディレクティブを追記する必要があることに注意しよう.

必要なusingディレクティブ
1
using Microsoft.AspNetCore.Authorization;
Studentsコントローラーの変更内容
 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
51
52
[Authorize]
public class StudentsController : Controller
{
    private readonly T8bContext _context;

    public StudentsController(T8bContext context) 
    {
        _context = context;
    }

    // Indexアクション(GETのみ)
    [AllowAnonymous]
    public IActionResult Index() { /* ..省略.. */ }

    private void SetupDepartmentList() => /* ..省略.. */;

    // Createアクション(GET用)
    public IActionResult Create() { /* ..省略.. */ }

    // Createアクション(POST用)
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Create([Bind("FirstName, LastName, Sex, PhoneNumber, Mail, Birthday, DepartmentId")] Student student) { /* ..省略.. */ }

    // Detailsアクション(GETのみ)
    [AllowAnonymous]
    public IActionResult Details(int? id) { /* ..省略.. */ }

    // Editアクション(GET用)
    public IActionResult Edit(int? id) { /* ..省略.. */ }

    // Editアクション(POST用)
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Edit(int id, Student student) { /* ..省略.. */ }

    // Deleteアクション(GET用)
    public IActionResult Delete(int? id) { /* ..省略.. */ }

    // Deleteアクション(POST用)
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Delete(int id, [Bind("Id")] Student student) { /* ..省略.. */ }

    // EditCircleAffiliationsアクション(GET用)
    public async Task<IActionResult> EditCircleAffiliations(int? id) { /* ..省略.. */ }

    // EditCircleAffiliationsアクション(POST用)
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> EditCircleAffiliations(int? id, List<CircleSelection> circleSelections) { /* ..省略.. */ }
}

つぎにCirclesコントローラーにアクセス制御の設定を行おう. Circlesコントローラーは,表8b-8-2に示す通りIndexアクションとDetailsアクションのみ匿名アクセスを許可することにする. Controllers/CirclesController.cs を_に示すように変更しよう. なお_も各メソッドの内容は省略している.

Circlesコントローラーの変更内容
 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
[Authorize]
public class CirclesController : Controller
{
    private readonly T8bContext _context;

    public CirclesController(T8bContext context)
    {
        _context = context;
    }

    // GET: Circles
    [AllowAnonymous]
    public async Task<IActionResult> Index() { /* ..省略.. */ }

    // GET: Circles/Details/5
    [AllowAnonymous]
    public async Task<IActionResult> Details(int? id) { /* ..省略.. */ }

    // GET: Circles/Create
    public IActionResult Create() { /* ..省略.. */ }

    // POST: Circles/Create
    // To protect from overposting attacks, enable the specific properties you want to bind to.
    - For more details, see http:*go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("Id,Name,Description")] Circle circle) { /* ..省略.. */ }

    // GET: Circles/Edit/5
    public async Task<IActionResult> Edit(int? id) { /* ..省略.. */ }

    // POST: Circles/Edit/5
    // To protect from overposting attacks, enable the specific properties you want to bind to.
    - For more details, see http:*go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(int id, [Bind("Id,Name,Description")] Circle circle) { /* ..省略.. */ }

    // GET: Circles/Delete/5
    public async Task<IActionResult> Delete(int? id) { /* ..省略.. */ }

    // POST: Circles/Delete/5
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> DeleteConfirmed(int id) { /* ..省略.. */ }

    private bool CircleExists(int id) { /* ..省略.. */ }
}

最後にAdminコントローラーにアクセス制御の設定を行おう. Adminコントローラーは,表8b-8-2に示す通りIndexLoginAccessDeniedアクションのみ匿名アクセスを許可する. Controllers/AdminController.cs を_に示すように変更しよう. なお_も各メソッドの内容は省略している.

Adminコントローラーの変更内容
 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
[Authorize]
public class AdminController : Controller
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly SignInManager<IdentityUser> _signInManager;

    public AdminController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager) 
    {
        _userManager = userManager;
        _signInManager = signInManager;
    }

    // Indexアクション(GETのみ)
    [AllowAnonymous]
    public IActionResult Index() { /* ..省略.. */ }

    // Loginアクション(GET用)
    [AllowAnonymous]
    public IActionResult Login() { /* ..省略.. */ }

    // Loginアクション(POST用)
    [AllowAnonymous]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login(LoginUserInfo loginUserInfo) { /* ..省略.. */ }

    // Logoutアクション(POSTのみ)
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Logout() { /* ..省略.. */ }

    // AccessDeniedアクション(GETのみ)
    [AllowAnonymous]
    public IActionResult AccessDenied() { /* ..省略.. */ }
}

ここまで書けたら実行してみよう.もしログイン済みとして認識されている場合はいったんログアウトしておこう. 「学生管理」のリンクをクリックして,「新規作成」のリンクをクリックしてみよう. この部分は認証済みのユーザーしかアクセスできないため,ログイン画面に転送されることが分かるはずである(_). また,いったん戻って学生の一覧から適当な学生をクリックして学生詳細画面(Details)を表示させよう. この画面から,「編集」や「削除」のリンクをクリックしても同様にログイン画面に転送されることを確認しておこう(__).

つぎに/Admin/Loginにアクセスしてログインしよう(ユーザー名はadmin,パスワードはp@55W0rD). ログイン後は,学生の新規作成画面(Create)や,学生の詳細画面(Details)から編集画面(Edit)や 削除画面(Delete)にアクセスすることができ,実際に 新規学生の登録や既存の学生の編集,削除が可能であることを確認しておこう(__).

実行結果

ここまでを確認できたら今回のチュートリアルは完了である. なお今回は課題が出題されている.忘れずに取り組むこと

Last updated on 2024-06-10
Published on 2024-06-10

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