Azure Web Apps を Azure AD アプリ登録と OpenID Conenctでアクセス制限する
関連記事リンク
- Azure App Service を作成する
- Azure Web Apps に Local Git 経由でアプリケーションをデプロイする
- Azure Web Apps を Azure AD アプリ登録と OpenID Conenctでアクセス制限する
登場人物と簡単な概要
- Azure Ad App Registration : Azure AD 上でアプリケーションの認証・認可を行うための IdP (Identity Provider) としての登録。原理的には OpenID Connect を使っている他の IdP サービス (Okta や Auth0 など) でも同様の設定手法が使える。
- Azure Web Apps Authentication : アプリケーション本体には手を加えずに Azure AD 認証 (AAD認証)や今回のOpenID Connect (OIDC認証)や、MicrosoftアカウントやFacebook認証などの認証のやりとりを設定だけで実行してくれるサービス。
- Application : 実際に動かしたいアプリケーション。認証された結果は HTTP ヘッダーの
x-ms-client-principal-name
などで得ることができる。
Azure AD App Registration でアプリケーションを登録する
Azure Active Directory の App Registrations から New registration をする。
名前はユーザーに見える表示名になるので分かりやすいものを指定するのをおすすめ。
(ただしSP発=アプリケーションのURLに直接アクセスして認証する場合は、途中の認証画面でちょこっとだけ出てくるぐらいなので気づかれないことも多い)
アプリケーション登録ができるといろんな文字列が並んだ画面に遷移する。
とりあえず左ペインの Authentication に移動して Platform configrations で Add a platform する。ここでは Azure AD で認証された後に Web Apps にコールバックするときの URL を設定する。
コールバック URL は以下のようなもの。
- WebAppsName: ユーザーから見たときに認証・認可後にアクセスされるドメイン (社内などのプライベートネットワークの場合は Private Endpoint や Private Hosted Zone で解決できる名前)
- IdP Name : Web Apps Authentication の設定画面で設定する Identity Provider 名とそろえる。(後で設定するのでここでは
OIDC
といった文字列を決め打ちするのもよい)
https://[WebAppsName].azurewebsites.net/.auth/login/[IdP Name]/callback
次に API Permissions に移動し、アプリケーション全体をユーザーに利用させるときに「管理者に承認されていないアプリケーションです」というメッセージを隠すために Grant admin consent for テナント名を実行しておく。(アプリケーションを Azure AD 上でまとめて同意(consent)しておくの意味)
同意することの確認メッセージ
アプリケーションが全体として同意された後の表示
OpenID Connect の情報を控えておく
App Registrations のトップ画面に移動して Application ID (Client ID) の情報を控えておく。
次に Endpoints を押して OpenID Connect metadata document の URL の情報を控えておく。
Credential secret を生成する
左ペインの Certificates & secrets から Client secrets 画面にいき New client secret を実行する。
Client secret は最長でも2年間しか指定できない。定期的に手動で更新するのもよいが Azure Logic Apps で更新を自動化するのも手。
生成された Client secret の Value 欄をコピーして控えておく。この値は生成時に 1 回しか表示されないのでもしも紛失したときは再生成するしかないので注意。
Azure Web Apps Authentication を設定する
Azure Web Apps に移動して Authentication から Add Identity provider を実行する。
Identity Providerとの接続方式を選ぶ。ここでは OpenID Connect を選択。
Azure AD App Registration の作成で得られた各種のパラメータを埋めていく。
- OpenID provider name は
コールバック URL の時に埋め込んだ文字列
とそろえる。OIDCで決め打ちにしたなら同じにする。 - Metadata entry は Document URL にして、Metadata URL は OpenID Connect の情報で得られた
OpenID Connect metadata document の URL
を入力する。 - Client ID は OpenID Connect の情報で得られた
Application ID (Client ID)
とそろえる。 - Client secret は
Credential secret を生成した時の Vaule
を入力する
それ以外はデフォルトのままでよい。
Scopes は特に設定項目がないので Add する。
設定が終わると Authentication settings や Identity provider が表示されているので、実際にアクセスしてみると認証・認可が動いているか確認できる。
認証・認可されてアプリケーションにアクセスされると、Web Apps から Application には x-ms-client-principal
で始まる HTTP ヘッダーでユーザーアカウントの情報が引き渡されていることが分かる。
- x-ms-client-principal-name : Azure AD 上のユーザーアカウント名
- x-ms-client-principal-id : Azure AD 上のユーザーアカウントのオブジェクトID (GUID)
- x-ms-client-principal-idp : Azure Web Apps Authentication で指定した
OpenID provider name
と同じ文字列 - x-ms-token-[IdP Name]-id-token : 今回の場合は OpenID の JWT 形式にエンコードされた認証情報
実際に認証・認可されてリダイレクトされていく様子
- 1行目) アプリケーションの URL (Web Apps の公開ドメイン名)にアクセスする
→ 認証・認可のために 302 Redirect で Azure AD の OAuth2 エンドポイント に回されている - 2行目) Azure AD の OAuth2 エンドポイントで実際に認証・認可がされている
この時に Azure AD のユーザー認証と合わせて条件付きアクセスなどが評価され NG の場合はエラー画面に遷移してアプリケーションには戻ってこない。OK の場合は次のコールバック URL へ遷移する。 - 3行目) Azure Web Apps の コールバック URL に認証トークンを持っていく
- 4行目) 実際のアプリケーションとのやりとりが開始される
Discussion