teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2021/02/28 11:12

投稿

退会済みユーザー
answer CHANGED
@@ -27,4 +27,36 @@
27
27
  ASP.NET Core での単純な承認
28
28
  [https://docs.microsoft.com/ja-jp/aspnet/core/security/authorization/simple](https://docs.microsoft.com/ja-jp/aspnet/core/security/authorization/simple)
29
29
 
30
- 上記のような話ではないなら、そもそも何がしたいのかのシナリオ・目的などを書いてください。
30
+ 上記のような話ではないなら、そもそも何がしたいのかのシナリオ・目的などを書いてください。
31
+
32
+ **【追記】**
33
+
34
+ > ロールを使用する場合、世間一般にはどういう様に実装しているのか? ロールチェックやセッション変数の使い方が分っていても、実際の具体的な実装方法が知りたいです。
35
+
36
+ 「世間一般には」というと、自分が知る限りでは上の回答に書いた通りアクセスの制限で、[Authorize(Roles = "Administrator")] というような属性を付与することです。
37
+
38
+ ロールによって同じページの中で処理を分けるというのは自分の想像の範囲を超えてました。
39
+
40
+ > 「IsInRoleAsync()を毎回使う」のと、「その結果をセッション変数に入れておく」方法のコスト差(主に実行時の速度パフォーマンス)が気になります。DBとのデータアクセスの方が遥かにコストが高いので気にする事は無いのかもしれませんが
41
+
42
+ IsInRoleAsync() メソッドを使うとそのたび DB にアクセスするが、それを避けるために Session を使うということを考えているのですよね。
43
+
44
+ 上の回答で紹介した記事、
45
+
46
+ ASP.NET Core でのロールベースの承認
47
+ [https://docs.microsoft.com/ja-jp/aspnet/core/security/authorization/roles](https://docs.microsoft.com/ja-jp/aspnet/core/security/authorization/roles)
48
+
49
+ に書いてあるように、ClaimsPrincipal クラスの IsInRole メソッドを使ってください。以下のような感じ。
50
+
51
+ ![イメージ説明](28e5e2bf3f9c6da3a2a12a60f3b2595b.jpeg)
52
+
53
+ 質問者さんの先のスレッド [https://teratail.com/questions/321876](https://teratail.com/questions/321876) で言いましたが、User で取得できるのは ClaimsPrincipal です。なので、OnGetAsync メソッドの中で上のようにして ClaimsPrincipal.IsInRole メソッドで判定できます。
54
+
55
+ User すなわち ClaimsPrincipal は認証クッキーに含まれる認証チケットから生成するので、いちいち DB にアクセスしに行ってません。なので「その結果をセッション変数に入れておく」うんぬんは全く考える必要はありません。
56
+
57
+
58
+ > リスト1つの関数内であれば、関数の先頭で取得して、AdminFlgを覚えておけば良いですが、ページが複数あるのでそれぞれの、ユーザの情報や、店舗情報、イベントのページでGetやPostが呼ばれる毎に毎回IsInRoleAsync()で取得するのは、当然の事なのでしょうか? これらの処理を行う共通関数を用意して、OnGetなどの各関数の先頭でuserManager、User、AdminFlg、OwnerFlgを引数にして呼ぶ・・・というよりは、これらの要素を持ったクラスを生成する?のが良いのでしょうか?
59
+
60
+ 上に述べた通りです。User (ClaimsPrincipal) は必ず生成されますので、それから IsInRole メソッドでロールに属するか否かを判定してください。
61
+
62
+ ![イメージ説明](34eeb38aaffa4a8d2a1022b47124e8c5.jpeg)

1

訂正

2021/02/28 11:11

投稿

退会済みユーザー
answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  あるページへのロールによるアクセス制限がしたいということなら、ページのクラスに Authorize 属性を付与すれば「ロールの確認(IsInRoleAsync)をするタイミング」だとか「チェックをしセッション変数に入れる」とかに悩む必要はありません。
4
4
 
5
- 例えば Administrator というロールがあって、Administrator ロールを持つユーザー以外のあるページへのアクセスを制限したいならページのクラスに以下のように属性を付与すれば OK です。お試しください。
5
+ 例えば Administrator というロールがあって、Administrator ロールを持つユーザー以外のページへのアクセスを制限したいなら、そのページのクラスに以下のように属性を付与すれば OK です。お試しください。
6
6
 
7
7
  ```
8
8
  [Authorize(Roles = "Administrator")]