質問: "Administrator")] の方法が良い(オマケ)
回答: そもそも何をしたいのか分かりません。それによって答えが変わってくると思うのですが、普通にロールを使う話としてレスします。 あるページへのロールによるアクセス制限がしたいということなら、ページのクラスに Authorize 属性を付与すれば「ロールの確認(IsInRoleAsync)をするタイミング」だとか「チェックをしセッション変数に入れる」とかに悩む必要はありません。 例えば Administrator というロールがあって、Administrator ロールを持つユーザー以外のページへのアクセスを制限したいなら、そのページのクラスに以下のように属性を付与すれば OK です。お試しください。 ``` Authorize(Roles = "Administrator")] public class PrivacyModel : PageModel { } ``` Razor ASP.NET Core でのページ承認規則 以下抜粋(翻訳がアレなので英文を載せておきます): "注意 An AuthorizeFilter can be applied to a page model class with the [Authorize] filter attribute. For more information, see Authorize filter attribute." ASP.NET Core でのロールベースの承認 残念ながら OnGetAsync() や OnPostAsync() 単位には Authorize 属性は適用できないそうです。 ASP.NET Core での単純な承認 上記のような話ではないなら、そもそも何がしたいのかのシナリオ・目的などを書いてください。 **【追記】** > > ロールを使用する場合、世間一般にはどういう様に実装しているのか? ロールチェックやセッション変数の使い方が分っていても、実際の具体的な実装方法が知りたいです。 > > > 「世間一般には」というと、自分が知る限りでは上の回答に書いた通りアクセスの制限で、[Authorize(Roles = "Administrator")] というような属性を付与することです。 ロールによって同じページの中で処理を分けるというのは自分の想像の範囲を超えてました。 > > 「IsInRoleAsync()を毎回使う」のと、「その結果をセッション変数に入れておく」方法のコスト差(主に実行時の速度パフォーマンス)が気になります。DBとのデータアクセスの方が遥かにコストが高いので気にする事は無いのかもしれませんが > > > IsInRoleAsync() メソッドを使うとそのたび DB にアクセスするが、それを避けるために Session を使うということを考えているのですよね。 上の回答で紹介した記事、 ASP.NET Core でのロールベースの承認 に書いてあるように、ClaimsPrincipal クラスの IsInRole メソッドを使ってください。以下のような感じ。 ![イメージ説明 質問者さんの先のスレッド で言いましたが、User で取得できるのは ClaimsPrincipal です。なので、OnGetAsync メソッドの中で上のようにして ClaimsPrincipal.IsInRole メソッドで判定できます。 User すなわち ClaimsPrincipal は認証クッキーに含まれる認証チケットから生成するので、いちいち DB にアクセスしに行ってません。なので「その結果をセッション変数に入れておく」うんぬんは全く考える必要はありません。 > > リスト1つの関数内であれば、関数の先頭で取得して、AdminFlgを覚えておけば良いですが、ページが複数あるのでそれぞれの、ユーザの情報や、店舗情報、イベントのページでGetやPostが呼ばれる毎に毎回IsInRoleAsync()で取得するのは、当然の事なのでしょうか? これらの処理を行う共通関数を用意して、OnGetなどの各関数の先頭でuserManager、User、AdminFlg、OwnerFlgを引数にして呼ぶ・・・というよりは、これらの要素を持ったクラスを生成する?のが良いのでしょうか? > > > 上に述べた通りです。User (ClaimsPrincipal) は必ず生成されますので、それから IsInRole メソッドでロールに属するか否かを判定してください。 !イメージ説明