Azure ActiveDirectory (B2Cでない方)を認証に使う
ログインユーザーの権限管理でサンプルにもある、ロールベースやポリシーベースを使おうとしていた。
AzureAD(Free)での権限管理はいろいろ方法があるみたい。ドキュメントもちょっと散らかってる感あってわかりにくい…
紹介されているやりかた(全部ではないかも)
アプリケーションにアプリ ロールを追加してトークンで受け取る
参照)https://docs.microsoft.com/ja-jp/azure/active-directory/develop/howto-add-app-roles-in-azure-ad-apps
ちなみにですがB2Cのテナントだと画面が違います。アプリロールやトークン構成のメニューはありません。
ただB2Cでも同じ設定はマニフェストの編集により可能です。
(ずっとB2Cの画面で探しててそれにもハマった…)
参考:ロールベース
テナントにカスタムロール追加
https://docs.microsoft.com/ja-jp/azure/active-directory/roles/custom-create
AzureAD(Free)では使えません。
ADテナント全体にロールを作成する方法(ビルトインロール以外)
ポリシーベース
一番カスタム可能な内容、ユーザークレーム(属性)に条件付与してポリシーを適用できたりする。
ここでグループクレームからポリシーを適用しようとしたが、groupがAPI側で取れていなかった。(後述)
参考)
https://docs.microsoft.com/ja-jp/azure/active-directory/hybrid/how-to-connect-fed-group-claims
サンプル)
https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/blob/master/5-WebApp-AuthZ/5-2-Groups/README.md
クレームベース
クレームベース∈ポリシーベース
ということかな。
ユーザーをグループに割り当ててグループによりポリシーを適用しようとした。
ここから本題
今回の構成はSPA(Blazor WASM+ASP.NET Core)なので、公式参照しながら設定
参考)
https://docs.microsoft.com/ja-jp/aspnet/core/blazor/security/webassembly/hosted-with-azure-active-directory?view=aspnetcore-6.0
このへんから。
逸る気持ちを抑えて、じっくり読めばちゃんと動くはず。いらちを発動するとよくハマるので。笑
では次に別のチュートリアル参照しながら、特定のグループに所属しているユーザーのみコールできるAPI(ASP)を作成する。
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/active-directory-optional-claims?WT.mc_id=translate-blog-yoterada#configuring-groups-optional-claims
このへんでまずはクライアント(SPA側)にGroupsが入るように設定した。
ちなみにこのドキュメント内の「[管理] で、 [トークン構成] を選択します。」はB2Cテナントでは表示されません。(再
ここでハマりポイント(自分的)だったのはトークン発行されるのはSPA側なので、上記のトークン構成はクライアント側しかやっていなかった。
本当はサーバー側も設定が必要だった。
起こっていた状態
id_tokenにはgroupsのclaimがあったが、
access_tokenにはgroupsが入っていない。
→ASP側でgroupsが判別できない。
jwt.ioで確認しまくった…
やったこと(解決)
サーバー側アプリケーションのトークン構成でもgroupsの設定をする。
ちなみに、Audienceがない、と言われてログインもできないとき
https://docs.microsoft.com/ja-jp/aspnet/core/blazor/security/webassembly/hosted-with-azure-active-directory?view=aspnetcore-6.0#app-settings
上記参照、ちょっと日本語わかりにくいがAudienceの設定がsettings.jsonあたりに必要なようす。