情報応用演習Ⅰ(2024)

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

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

8b-8. コントローラー/アクションごとのアクセス制御の方法

とりあえずログインとログアウトは可能になったが,いまのところログインしていようがいまいが 依然として全てのアクション/ビューにアクセスでき,かつ操作を行える状態である. アクセス制御を指定するためにはコントローラーのクラスや,アクションメソッドに [Authorize]属性[AllowAnonymous]属性を指定する必要がある. これらを使ったアクセス制御の方法には以下の2通りの使い方がある.

  • 【方法$\alpha$】コントローラー全体をユーザー認証必須にしたうえで,一部のアクションの匿名アクセスを許可する(_(1)).
  • 【方法$\beta$】一部のアクションのみユーザー認証必須する(_(2)).
アクセス制御の方略

[Authorize]属性はクラス(=コントローラー)にもメソッド(=アクション)にも指定することができるが, クラスに指定した場合は,そのクラスに含まれているすべてのアクションメソッドがユーザー認証必須になる. その場合でも個々のメソッドに[AllowAnonymous]属性を指定することで,未認証の匿名ユーザーからのアクセスを許可することができる.

クラスに[Authorize]属性を付けない場合は,それに含まれるすべてのメソッドは基本的に匿名ユーザーからのアクセスが可能なものとなる. この場合でも個々のメソッドに[Authorize]属性を付加すると,そのアクションメソッドはユーザー認証必須にすることができる.

これら二つの使い方の例を_に示す.ここではHogePiyoという名前のコントローラーがあり, 各々4つずつアクションメソッドを持っている.Hogeコントローラー(_左)は【方法$\alpha$】で, Piyoコントローラー(_右)は【方法$\beta$】でアクセス制御を設定している.

ユーザー認証の設定方法の例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
//////////////////////////////////////////////////
//
// 【方法α】での設定例
// 
//////////////////////////////////////////////////
[Authorize]
class HogeController : Controller
{                                      // ↓アクション名

    public IActionResult Eins(){ ... } // アイン


    public IActionResult Zwei(){ ... } // ツヴァイ

    [AllowAnonymous]
    public IActionResult Drei(){ ... } // ドライ


    public IActionResult Vier(){ ... } // フィーア
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
//////////////////////////////////////////////////
//
// 【方法β】での設定例
// 
//////////////////////////////////////////////////

class PiyoController : Controller
{                                        // ↓アクション名

    public IActionResult Funf(){ ... }   // フィンフ

    [Authorize]
    public IActionResult Sechs(){ ... }  // ゼクス

    [Authorize]
    public IActionResult Sieben(){ ... } // ズィーベン

    [Authorize]
    public IActionResult Acht(){ ... }   // アハト
}

この場合,認証済みのユーザーと未認証の匿名ユーザーがそれぞれどのアクションにアクセス可能になるかを _に示す.

2つのユーザー認証の設定方法の例の結果
コントローラーアクション認証済みのユーザー匿名ユーザー備考
Hoge【方法$\alpha$】クラスに[Authorize]属性を付与
Eins×属性指定なし
Zwei×属性指定なし
Drei[AllowAnonymous]属性を付与
Vier×属性指定なし
Piyo【方法$\beta$】クラスには属性指定なし.
Funf属性指定なし
Sechs×[Authorize]属性を付与
Sieben×[Authorize]属性を付与
Acht×[Authorize]属性を付与

凡例:〇...アクセス可,×...アクセス不可

Hogeコントローラーはクラス自体に[Authorize]属性が付加されているため,基本的にどのアクションも 認証を済ませたユーザーからしかアクセスができない.ただしDreiアクションには[AllowAnonymous]属性が付加されているため 例外的にこのアクションのみ匿名アクセスが可能となっている.

Piyoコントローラーはクラス自体には属性を指定していないため,基本的にどのアクションも匿名アクセスが可能である. ただしアクションSechsSiebenAchtには[Authorize]属性が付加されているため,結局匿名アクセスが 可能なのはFunfアクションのみとなっている.

今回のプロジェクトにはここまでの作業で,Homeコントローラー,Studentsコントローラー,Departmentsコントローラー, Circlesコントローラー,Adminコントローラーの5つのコントローラーが含まれている.これらがもつ各々のアクションのアクセスの可否は _に示すように設定することにしよう.基本的に「新規作成」や「編集」,「削除」といったデータベースの状態に変更をもたらす アクションは認証済みのユーザーしかアクセスできないようにする.なおここで例として扱っている「学生情報」は実際のシステムであれば個人情報に 相当する情報なので,本来ならば閲覧についても匿名アクセスを許すべきではない.しかし,ここでは練習のためこのようなアクセス制御を採用している ということに留意していただきたい.

T8bに含まれるコントローラーのアクセス制御リスト
コントローラーアクション認証済みのユーザー匿名ユーザー備考
HomeIndexすべての匿名アクセス可(なので設定不要).
Privacy
Error
StudentsIndexIndexDetailsのみ匿名アクセス許可.
Create×
Details
Edit×
Delete×
EditCircleAffiliations×
DepartmentsIndexすべての匿名アクセス可(なので設定不要).
Details
CirclesIndexIndexDetailsのみ匿名アクセス許可.
Create×
Details
Edit×
Delete×
AdminIndexIndexLoginAccessDeniedのみ匿名アクセス許可.
Login
Logout×
AccessDenied

凡例:〇...アクセス可,×...アクセス不可

AdminコントローラーのLoginアクションは匿名アクセスを許さないと誰もログインできなくなってしまうので, 匿名アクセスを許可する必要がある点に注意しよう.

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

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