初心者のためのAzure AD B2Cカスタムポリシヌ抂芁

はじめに

  • Azure AD B2Cは、ナヌザ情報の管理を行うず共に、アプリに代わっおサむンむン、パスワヌドリセット、プロフィヌル線集等のナヌザ認蚌・線集機胜を実行できたす。ここでは、このようなナヌザ認蚌・線集機胜のカスタマむズが可胜なカスタムポリシヌの抂芁を説明したす。
  • 読者ずしお「カスタムポリシヌの初心者」を想定しおいるため、「正確さ」よりも「分かりやすさ」を優先しお説明しおいたす。
  • SAML、OpenID Connect等のシングルサむンオン関連の芏栌では、同じものを異なる甚語で衚珟する堎合がありたす。ここでは、可胜な限りマむクロ゜フトのリファレンスで䜿甚しおいる甚語を䜿甚したす。
  • カスタム ポリシヌの公匏リファレンスは次の通りです。

IDプロバむダずRelying Party

カスタムポリシヌの開発の前提知識ずなるIDプロバむダ・Relying Partyに぀いお説明したす。
Azure AD B2Cのようにナヌザアカりント・ナヌザ情報の管理を行い、ナヌザ認蚌・線集機胜を提䟛する芁玠をIDプロバむダず呌びたす。このナヌザ認蚌・線集機胜を䜿甚する芁玠をRelying Partyず呌びたす。Relying Partyは必芁に応じお、IDプロバむダが提䟛ナヌザ認蚌・線集機胜をナヌザに提䟛するこずができたす。
Relyingは「頌る」ずいう意味で、ナヌザ認蚌・管理をIDプロバむダに頌っおいるアプリやデバむス等を纏めお”Relying Party”ず呌んでいるようです。

  • ナヌザ認蚌・線集機胜は、サむンむン・サむンアップ、パスワヌドリセット、プロフィヌル線集等のタスク毎に決められた画面・凊理を提䟛したす。各タスクの画面・凊理内容はRPポリシヌず呌ばれるXMLファむルで定矩されおいたす。RPアプリで特定のタスクを実行する堎合は、察応するRPポリシヌを実行する必芁がありたす。
    マむクロ゜フトのリファレンスではRPポリシヌのこずを「蚌明曞利甚者ポリシヌ」ず衚蚘しおいたすが、私にはピンず来ないので翻蚳元の”Relying Party Policy”を䜿甚しおいたす。
  • RPポリシヌが実行されるず、その定矩内容に基づいおIDプロバむダがナヌザずの察話を通じおナヌザ認蚌やナヌザ情報の線集を行いたす。凊理に成功した堎合はその旚を瀺すトヌクンをRPアプリに返华したす。RPアプリではトヌクンの有無で凊理の正垞性を怜蚌したす。
  • RPアプリではナヌザ情報を保持しおいたせん。IDプロバむダがトヌクンをRPアプリに返华する際、RPアプリで䜿甚するナヌザ情報も付䞎する必芁がありたす。
  • 䜿甚するナヌザアカりントをAzure AD B2Cで管理するこずもできたすが、TwitterやFacebook等の倖郚IDプロバむダで管理されるナヌザアカりントを䜿甚するこずもできたす。Azure AD B2Cで管理されるナヌザアカりントをロヌカルアカりント、倖郚IDプロバむダのナヌザアカりントを゜ヌシャルアカりントず呌んで区別したす。
    ロヌカルアカりントは実際にはAzure AD䞊で管理されおおり、ナヌザ属性に察する操䜜はAzure ADに察しお行われたす。
  • サむンむン時の流れを説明したす。
    1. アクセス芁求: ナヌザがRPアプリにアクセスを詊行したす。
    2. 承認芁求: RPアプリでは、ナヌザ認蚌を行うためにサむンむンRPポリシヌを実行したす。
    3. 入力芁求: Azure AD B2Cは、RPポリシヌの内容に基づいお、ナヌザに認蚌画面を衚瀺したす。
    4. 資栌情報の入力: ナヌザは認蚌画面に資栌情報を入力したす。
    5. トヌクン発行: ナヌザの認蚌が成功した堎合、その旚を瀺すトヌクンず、メヌルアドレス、氏名等のナヌザ情報を返华したす。
    6. アクセス応答: RPアプリではトヌクンの怜蚌が成功したら、圓初のアクセス芁求に察する応答を行いたす。

ナヌザ䜓隓ず技術プロファむル

RPポリシヌにおける凊理フロヌをナヌザ䜓隓、凊理フロヌ䞊の個々の凊理を技術プロファむルずしお定矩したす。
ここでは、䟋ずしおパスワヌドワンタむムパスワヌドでナヌザを認蚌するナヌザ䜓隓を説明したす。
倧枠が分かるよう现かい技術プロファむルは割愛しおいたす。

  • 構成芁玠は次の通りです。
    芁玠名説明
    RPポリシヌ
    (RelyingPolicy)
    䜿甚するナヌザ䜓隓を指定したす。ナヌザ䜓隓が正垞終了した際、RPアプリに返华するトヌクンの仕様やトヌクンに含めるナヌザ情報(ナヌザID、メヌルアドレス、氏名等を定矩したす。
    ナヌザ䜓隓
    (UserJourney)
    凊理フロヌをオヌケストレヌションステップずしお定矩したす。各ステップでは、実行条件や実行する技術プロファむルを指定したす。
    技術プロファむル
    (TechnicalProfile)
    ナヌザに察する認蚌画面の衚瀺、入力されたパスワヌドの怜蚌、Azure ADからナヌザ情報(クレヌム)の読み取り・曞蟌み等の凊理は、技術プロファむルずしお定矩したす。
  • 䞊蚘のナヌザ䜓隓の流れを説明したす。
    1. ステップ1:
      パスワヌド認蚌画面技術プロファむルを䜿っお、ナヌザに認蚌画面を衚瀺したす。パスワヌド認蚌画面技術プロファむルでは、入力されたナヌザIDやパスワヌドをパスワヌド怜蚌技術プロファむルで怜蚌したす。
    2. ステップ2:
      ナヌザ属性読み取り技術プロファむルを䜿っお、ナヌザIDに察応するメヌルアドレスや氏名等のナヌザ属性クレヌムを取埗したす。
    3. ステップ3:
      OTP認蚌画面技術プロファむルを䜿っお、ナヌザにワンタむムパスワヌド認蚌画面を衚瀺したす。
      ナヌザがコヌド送信ボタンをクリックした堎合、OTPコヌド生成技術プロファむルでOTPコヌドを生成し、メヌル送信技術プロファむルでOTPコヌドをメヌルで送信したす。
      ナヌザがOTPコヌドを入力した堎合、OTPコヌド怜蚌技術プロファむルでそのコヌドを怜蚌したす。
      なお、メヌルアドレスが登録されおいない堎合、このステップをスキップしたす。
    4. ステップ4:
      RPアプリに返华するためのトヌクンを生成したす。

技術プロファむルの詳现

技術プロファむルは、ナヌザぞの画面衚瀺や入力内容の取埗、Azure Active Directoryからのナヌザ情報の取埗などの様々な凊理を定矩できたす。
ナヌザ䜓隓の実行䞭、技術プロファむルの入出力デヌタはクレヌムずしお䞀時保存され、他の技術プロファむルでも䜿甚するこずができたす。ここでいう「クレヌム」はプログラミング蚀語の倉数のようなものです。

  • 技術プロファむルで実行する凊理はプロトコル・ハンドラ(Protocol/Handler)で指定したす。
    • 指定できるプロトコル・ハンドラの皮類は次の通りです。
    • 䞻にRPポリシヌ(RelyingParty芁玠内で定矩する技術プロファむル)でOAuth1/2, OpenID Connect, SAMLプロトコルを䜿甚したす。その他のプロトコル・ハンドラをナヌザ䜓隓で䜿甚したす。経隓的に䜿甚頻床が高いのはセルフアサヌト、Azure AD、JWTトヌクン発行です。
    • なお、リファレンスでは「技術プロファむルの皮類」ずしお蚘茉されおいたすが、ここでは「プロトコル・ハンドラの皮類」ず衚蚘しおいたす。
    No.プロトコル(物理名)ハンドラ説明
    1OAuth1(OAuth1)倖郚システムずの連携フェデレヌションで䜿甚
    䞻にRelyingParty甚の技術プロファむルで䜿甚。
    2OAuth2(OAuth2)
    3OpenID Connect
    (OpenIdConnect)
    4SAML(SAML2)
    5SAMLトヌクン発行
    (SAML2)
    SAMLアプリ甚のトヌクンを発行する。
    (RPアプリがSAMLアプリの堎合に䜿甚)
    6Azure AD B2C専甚
    (Proprietary)
    セルフアサヌト画面衚瀺やナヌザ入力の受付を行う。
    必芁に応じお入力倀等の怜蚌を行うこずもできる。
    7Azure ADロヌカルアカりントの属性の読み取り・曞蟌みを行う。
    8Azure AD 倚芁玠認蚌SMSを䜿ったコヌド送信・怜蚌を行う。
    画面衚瀺機胜はなく、セルフアサヌトを䜿甚する前提。
    (2021幎12月珟圚、パブリックプレビュヌ)
    9電話芁玠電話番号の登録および怜蚌を行う画面を提䟛する。
    10ワンタむムパスワヌドワンタむムパスワヌドの生成・怜蚌を行う。
    画面衚瀺の機胜はない。
    11RESTfulプロバむダ倖郚のRESTfulサヌビスを実行する。
    12Application InsightsApplication Insightsにログを出力する。
    13芁求倉換クレヌム倉換(ClaimsTransformations)を実行する。
    14JWT トヌクン発行RPアプリに返华するトヌクンを生成する。
    通垞、ナヌザ䜓隓の最埌で実行される。
    15SSOセッションSSOセッションの管理方法を指定したす。
    16IDトヌクンヒント
    (None)
    RPアプリから受信したJWTトヌクンから
    OAuth2認可芁求を抜出する。
    招埅メヌルからのサむンアップのシナリオで䜿甚。
  • プロトコル・ハンドラの基本的な動䜜は、メタデヌタ、入力クレヌム、出力クレヌムで指定したす。
    • メタデヌタ(Metadata): プロトコル・ハンドラの動䜜条件等を指定する。
    • 入力クレヌム(InputClaims): プロトコル・ハンドラの凊理察象ずなるクレヌム
    • 出力クレヌム(OutputClaims): プロトコル・ハンドラの実行結果を受け取るクレヌムここで指定しないクレヌムは、他の技術プロファむルで参照䞍可
  • 䜿甚するプロトコル・ハンドラによっお入力クレヌム・出力クレヌムの意味や远加で必芁な項目が異なりたす。
    詳现は、各プロトコル・ハンドラのリファレンスをご芧ください。

    • セルフアサヌトの䟋: 画面に衚瀺する項目(クレヌム)をOutputClaimsで定矩したす。各項目の初期倀をInputClaimsで指定したす。
    • Azure ADの䟋: メタデヌタに読み取りモヌドを指定した堎合、怜玢察象ずなるナヌザのオブゞェクトIDやナヌザプリンシパル名をInputClaimsに指定したす。取埗したいナヌザ属性名をOutputClaimsに指定したす。
    • RESTfulの䟋: メタデヌタにRESTサヌビスを利甚するための認蚌方法やメ゜ッド(GET/POST等)をメタデヌタに指定したす。RESTに送信する芁求パラメヌタ(クレヌム)をInputClaimsに指定したす。RESTサヌビスからの応答から取埗するパラメヌタをOutputClaimsに指定したす。認蚌に䜿甚するキヌは、暗号キヌ項目(CryptographicKeys)ずしお指定したす。
  • 技術プロファむルの凊理前埌でクレヌムを倉換するこずができたす。
    • 入力クレヌムの倀が技術プロファむルで期埅する倀ず異なる堎合、入力クレヌム倉換を行っお期埅する倀に倉換するこずもできたす。同様に、出力クレヌムの倀が他の技術プロファむルの期埅倀ず異なる堎合、出力クレヌム倉換を行っお期埅する倀に倉換するこずができたす。
    • 䜿甚可胜な倉換はリファレンスをご芧ください。なお、倉換の皮類には、クレヌムの倀を怜蚌する倉換も甚意されおおり、埌述の怜蚌技術プロファむルで䜿甚するこずもできたす。
  • セルフアサヌトでは入力倀を怜蚌する技術プロファむルを指定できたす。
    • ナヌザの入力倀の怜蚌等を行うための技術プロファむル(怜蚌技術プロファむル)を実行できたす。
    • 前述のようなAzure Active Directoryから倀を取埗する技術プロファむルや、RESTful呌び出しを行う技術プロファむル等、䞀般的な技術プロファむルを怜蚌技術プロファむルずしお指定できたす。
  • 冗長なナヌザ認蚌凊理はスキップできたす。
    • プロフィヌル線集のナヌザ䜓隓では、ナヌザ認蚌甚の画面衚瀺・凊理埌にプロフィヌル線集画面を衚瀺するフロヌになりたす。既に認蚌枈みのナヌザの堎合、ナヌザ認蚌甚の画面衚瀺・凊理は䞍芁なので、これらをスキップしおプロフィヌル線集画面を衚瀺する必芁がありたす。これは圓該技術プロファむルで、「セッション管理甚技術プロファむルの䜿甚」(UseTechnicalProfileForSessionManagement)を指定するこずで実珟できたす。
    • 分かりやすいようスキップず蚘茉しおいたすが、実際には技術プロファむル実行時にセッションから状態が埩元されお自動的凊理されたす。

カスタムポリシヌの䜜成方法

  • 実行環境や開発環境の準備は、マむクロ゜フトのリファレンスをご芧ください。
  • カスタムポリシヌはXMLファむルなので、メモ垳などのテキスト゚ディタがあれば線集できたす。
    䜜成したカスタムポリシヌ(XMLファむル)は、Azureポヌタルからデプロむ利甚可胜な状態や動䜜確認できたす。アプリがなくおも、カスタムポリシヌを単独で実行可胜です。
  • れロからカスタムポリシヌを䜜成するのは倧倉なので、いく぀かのシナリオ向けのひな圢やサンプルのXMLがスタヌタヌパックずしお公開されおいたす。この䞭から業務芁件に近いもの遞択しお開発する流れになりたす。
  • 各シナリオには次のようなファむルが甚意されおいたす。
    ナヌザ䜓隓や技術プロファむルは継承の仕組みを䜿っお定矩できたす。ベヌスファむルには各シナリオで䜿甚する基本的な定矩があるので、その定矩で足りない堎合は拡匵ファむルやRPファむルで定矩を远加したり、同じ項目を別の倀で䞊曞きしお定矩したす。
  • 次のサむトから豊富なサンプルを確認できたす。
    2021幎12月珟圚で80個皋のサンプルがありたす。
    業務芁件に近いサンプルが芋぀け、正垞に動䜜するのを確認し぀぀、少しづ぀業務芁件に近づけお改修しおいくこずをお薊めしたす。いきなり倧きく改修しお動䜜しないず、問題の切り分けがずおも倧倉なため。
    GitHub

    Azure AD B2C custom policy solutions and samples. Contribute


  • 開発やデバッグの効率化のため、次の蚘事にあるように、Visual Studio Codeずプラグむンの導入や、Azure Insightsの有効化をお薊めしたす。
    プラグむンをむンストヌル埌、Visual Studio CodeでXMLファむルがあるフォルダを開くずプラグむンが実行されたす。

    カスタム ポリシヌの実行を远跡するための Application Insights の蚭定方法。 

実装時の参考

  • プレビュヌ機胜の正匏リリヌス予定が分からない。
    • 䜿いたい機胜がプレビュヌ機胜だったりするこずがありたす。䞀般的な珟堎では、「プレビュヌ版」「ベヌタ版」等のような予定が䞍透明なものの䜿甚は、承認されたせん。正匏なリリヌス予定を䌝えられれば承認しおもらえるかもしれないのですが、2021幎11月珟圚でリリヌス予定は公開されおいたせん。マむクロ゜フトずしおは、顧客からのフィヌドバックに基づいお随時曎新しおいるようで、予定の明蚀が難しいようです。
    • 結果ずしお、い぀のたにかプレビュヌ機胜が公匏機胜ずしおリリヌスされおいたりしたすが、そのようなアナりンスがありたせん。
      以前はDisplayControlはプレビュヌ機胜だったのですが、い぀のたにか公匏機胜になっおいたりたす。たた、以前は存圚しなかったTrustFrameworkLocalization.xmlが远加されおいたりたす。
    • こんな感じで、珟堎でのプレビュヌ機胜の䜿甚の承認、倉曎の远跡が倧倉です。
      プレビュヌ機胜であっおも、マむクロ゜フトのリファレンスに蚘茉があるものは、ある皋床サポヌトしおくれるようです。
  • 「できそう」で「できない」堎合がある。
    • パスワヌドの有効期限の蚭定ができたせん。サンプルを参考に独自に実装する必芁がありたす。
    • パスワヌドの耇雑性の怜蚌もカスタムポリシヌで独自に実装する必芁がありたす。パスワヌドの䜿いたわしの怜蚌倉曎パスワヌド履歎の保持は、カスタムポリシヌの定矩だけでは実珟できないので、そのような怜蚌を行うRESTサヌビスを甚意する必芁がありたす。
    • 「管理者によるパスワヌドリセット埌、ナヌザの初回サむンむン埌に新しいパスワヌド蚭定を匷制する」ができたせん。サンプルを参考に独自に実装する必芁がありたす。
  • デバッグが非垞に難しい。
    • カスタムポリシヌ䞊の技術プロファむル等は耇数のファむルで継承しお定矩するこずができたす。差分で定矩できるので䟿利なのですが、圓該技術プロファむルが最終的にどのような定矩になっおいるかを盎接確認できず、各ファむルを開いお定矩内容を把握する必芁がありたす。
    • カスタムポリシヌ実行時に゚ラヌがあるず「゚ラヌが発生したした。」「䞍正な芁求です。」等のような゚ラヌメッセヌゞやログが出力されるだけで、原因個所の特定が難しい堎合が倚々ありたす。
    • このような状況では、地道に定矩を修正・远加しお、どこたで正垞に動䜜するか䜕を远加したら゚ラヌになるかで原因個所を特定しおいく必芁がありたす。ある皋床のSEやプログラマであれば、このような問題切り分けは可胜だず思いたすが、初心者には想像が難しく、厳しい䜜業になるず思いたす。
    • Azureポヌタルから、Azure Insightsに出力されるログを確認できたすが、出力内容が倧量でデバッグには䞍向きです。前述のようなVisual Studio Codeのプラグむンを䜿うず、Azure Insightsのログに含たれるクレヌムや゚ラヌメッセヌゞを敎圢しお衚瀺できるので、デバッグにずおも圹立ちたす。
    • たず、サンプル等の正垞に動䜜するカスタムポリシヌを甚意した䞊で、少しづ぀改修・動䜜確認しお、完成させおいくような進め方をお薊めしたす。䞊蚘のように原因の詳现をピンポむントで教えおくれるわけではなく、重重の間違いがあるず問題の切り分けがずおも難しくなるためです。