Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Azure AD で管理画面のユーザーと権限管理

Azure AD で管理画面のユーザーと権限管理

Atsushi Nakagawa

November 06, 2020
Tweet

Other Decks in Technology

Transcript

  1. 自己紹介 中川 敦
 エンジニア
 
 マネーフォワード歴: 2014 年 ~ 


    (現在:アカウントアグリゲーション部) 
 
 • 得意な言語:C, Java, Python, Bash, JS 
 
 趣味:PC ゲーム。今ハマっているゲーム: 
 • Apex Legends
 • Hades(ハデス)

  2. 目次 1. Azure AD を使って利用者と権限の管理 
 2. 利用者を区別する識別子について 
 3.

    利用者の識別子から利用者情報の取得 
 4. Single Logout について 
 

  3. 利用者管理と利用権限
 利用者管理:
 • 利用者のメールアドレス、パスワード(ハッシュ) 
 
 権限管理:
 • 登録口座毎の取得記録(取得日時、取得結果、など) ←

    CS /アグリが利用 
 • 取得エラーの詳細な理由 ← CS /アグリが利用 
 
 • β 機能を(一部ユーザーに)開放 ← アグリが利用
 • アグリゲーション機能の(一時)停止 ← アグリが利用
 

  4. Azure Active Directory (Azure AD) を使うことの利点
 弊社では 「アグリ管理ウェブ」より前から Azure AD

    を使用していた(主に SSO 用) 
 
 • アグリ管理ウェブの機能削減: 
 ◦ 利用者毎のメールアドレスとパスワードの管理が不要 
 ◦ 別途権限管理が不要 
 
 • 代わりに Azure AD の機能を使用: 
 ◦ SSO でログイン
 ◦ Azure AD では利用者毎に「ロール」を設定可能(複数ロール可能) 
 

  5. → ユーザーが口座を選ぶと「code」が発行され「redirect_uri」で指定した URL にブラウザーが戻って来る 
 https://aggre-aweb.example/sso?code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq… 
 Azure AD の

    SSO を使ったログインイメージ (3/3)
 テクニカル: https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow
 POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token HTTP/1.1 client_id=...&client_secret=...&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq... { "access_token": "...", "expires_in": 3599, "refresh_token": "...", "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctOD...", } • アグリ管理ウェブ側では貰った「code」を用いてトークンを取得: 
 • 応答
 
 jwt 型式の JSON に利用者の名前、ロール(roles)情報など 

  6. 1. Azure Active Directory にアプリケーションを登録 
 1. サービス名を決めて Active Directory

    の管理画面より新規アプリケーションを追加 
 2. Redirect URI を設定(redirect_uri で許可する URL) 
 3. Logout URL を設定 (Single Logout 時に呼ばれる URL) 
 4. ウェブサービス側で使う client secret を発行 
 5. マニフェストファイルを編集してロールを定義 
 6. 利用者とロールを必要に応じて設定 
 
 2. ウェブサービス側の開発 
 1. ログイン用に Azure にリダイレクトする実装 
 2. 貰った code からログインを完了させる URL 
 i. Azure を照会して code からトークンを取得 
 ii. ロールなど利用者情報をセッション記録 
 3. Logout URL の実装(オプショナル) 
 Azure AD を使った SSO の開発の大まかな流れ
 "appRoles": [ { "allowedMemberTypes": ["User"], "description": "CS で業務を行う担当者のためのロールです ", "origin": "Application", ... "value": "CS" }, { "allowedMemberTypes": ["User"], "description": "アグリの業務を行うエンジニアのためのロールです ", "origin": "Application", ... "value": "AGGRE" }, ... 例

  7. アグリ管理ウェブの構成(+操作の申請&承認) アグリ管理ウェブ
 社内利用者
 (カスタマーサポート、 
 アグリゲーション部の担当) 
 の 連携機能のデータベース 


    利用者管理:
 ・メールアドレス
 ・パスワード
 ・権限(複数)
 → Microsoft Azure AD にて 
 操作の申請&承認情報 

  8. • どちらも利用者をユニークに識別 
 • ロール情報と同じように id_token の JSON 内に存在 


    
 • sub: Azure AD に登録した一つのアプリケーション内でのみユニーク 
 ◦ アプリケーションを再登録 → sub はゴミ化 
 ◦ アプリケーションとデータストアのライフサイクルが同じであれば問題ない 
 
 • oid: アプリケーションを跨いでもユニーク 
 ◦ アプリケーションを再登録 → oid は変わらない 
 ◦ scope=profile が必要。無ければ id_token に存在しない 
 利用者の識別子: Azure AD と sub と oid の違い

  9. Microsoft Graph のエンドポイントよりユーザー情報を照会: 
 • ログイン時に得た access_token を使う必要がある 
 


    
 
 
 
 応答:
 
 
 sub/oid を用いて利用者を取得
 GET https://graph.microsoft.com/v1.0/{tenant}/users/{oid} Authentication: Bearer ... { "displayName": "山田 太郎", "givenName": "givenName-value", "jobTitle": "jobTitle-value", "mail": "mail-value", "mobilePhone": "mobilePhone-value", ... "id": "id-value" }
  10. Logout URI → ログアウトを実施 
 • Front-Channel → アグリ管理ウェブで実装 


    • Back-Channel?
 Single Logout: 一括ログアウトについて