とある社内向けWebアプリを開発するときに認証基盤をどうするか検討した。
クラウドはAzureを使うので、Azure内でなんとかする。
前提
- 特に社内でActiveDirectoryなど使用していない
- 社員全員がメールアドレスを持っているわけではない
- 社員番号くらい
- 使用するのは社員のみ、ゲストなども必要なし
- 認証基盤自体は無料で使いたい
- ユーザー数は〜1,000程度
候補
Azureの認証基盤なので候補は実質2つ
- EntraID
- Azure AD B2C
EntraID (Azure AD B2B)
- 会社などの組織向けの認証基盤
- すでにADを導入してると連携できたりする
B2Bは導入しなかった、その理由
ログイン画面のカスタマイズができない
B2BではPremium(等)でないとログイン画面のカスタマイズができません。
通常のMicrosoftログインの画面になる。
参考)https://learn.microsoft.com/ja-jp/entra/fundamentals/how-to-customize-branding
けどB2Bではできること
MicrosoftGraphAPIが使用できる
meの情報などを取ってこれる=トークンに載らない追加情報をAPIから取ってこれる。
追加情報に部署など入れていても安心。
グループの情報がトークンに載せられる
グループ=ロールの設定をすることによりロールベースのアクセス制御がかけやすくなる。
Azure Active Directory B2C を利用することにした
- 一般Webアプリで使われるような感じ(ソーシャルログインなど)
ログイン画面がカスタマイズできる
Webに不慣れな方でも一目で自社のアプリだとわかってもらえる。
ただし…
GraphAPIは使用できない
User.Read.All
の権限を与えてもダメみたい。
グループなど、トークンに載せられない属性がけっこうある
トークンに載せたい情報は無理やり他の項目にマッピングさせた。
上記のようにロールが使えないので、必然的にポリシーベース認証の実装が必要。
B2Cを使うにあたり
不特定のサインアップをさせるわけではないので、ユーザーはSDKを利用して一括作成する。
ユーザーのインポート
B2BとB2CではSDKからのユーザーの作り方が違います。
B2Bと同じように作ってしまうと、非ローカルアカウント=B2Cのフローでログインできないユーザー
になってしまうので注意。
正しくは↓を参照
https://learn.microsoft.com/en-us/graph/api/user-post-users?view=graph-rest-1.0&tabs=csharp#request-1
Identitiesは複数無くても良い、メールアドレスでのログインなら
SignInType = "emailAddress"
を指定しておく。
所感
わかってしまえば簡単なんだけど、どうも公式がわかりにくい&ネットでの情報が少なめ…
あとチュートリアルがそのまま動かなかったりするのもわかりにくい…