Azure AD B2C を使用して WPF デスクトップ アプリの認証オプションを有効にする

この記事では、Windows Presentation Foundation (WPF) デスクトップ アプリケーション用に Azure Active Directory B2C (Azure AD B2C) の認証エクスペリエンスをカスタマイズおよび拡張する方法について説明します。

始める前に、Azure AD B2C を使用したサンプル WPF デスクトップ アプリケーションでの認証の構成に関する記事を理解しておいてください。

サインイン名を事前入力する

サインイン ユーザー体験中に、アプリが特定のユーザーをターゲットにする場合があります。 アプリがユーザーを対象とする場合は、認証要求にユーザーのサインイン名を含む login_hint クエリ パラメーターを指定できます。 Azure AD B2C によってサインイン名が自動的に入力されるので、ユーザーはパスワードを入力するだけで済みます。

サインイン名を事前入力するには、次の手順を実行します。

  1. カスタム ポリシーを使用している場合は、直接サインインの設定に関する記事の説明に従って、必要な入力要求を追加します。
  2. Microsoft Authentication Library (MSAL) 構成オブジェクトを探し、ログイン ヒントを使用して withLoginHint() メソッドを追加します。
authResult = await app.AcquireTokenInteractive(App.ApiScopes)
    .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
    .WithLoginHint("bob@contoso.com")
    .ExecuteAsync();

ID プロバイダーを事前に選択する

Facebook、LinkedIn、Google などのソーシャル アカウントを含むようにアプリケーションのサインイン プロセスを構成した場合は、domain_hint パラメーターを指定できます。 このクエリ パラメーターは、サインインに使用する必要があるソーシャル ID プロバイダーに関するヒントを Azure AD B2C に提供します。 たとえば、アプリケーションで domain_hint=facebook.com を指定した場合、サインイン フローで Facebook のサインイン ページに直接移動します。

外部 ID プロバイダーにユーザーをリダイレクトするには、以下を実行します。

  1. 外部 ID プロバイダーのドメイン名を確認します。 詳細については、「サインインをソーシャル プロバイダーにリダイレクトする」を参照してください。
  2. Dictionary オブジェクトを作成するか、既存のものを使用して、追加のクエリ パラメーターを格納します。
  3. 対応するドメイン名が含まれる domain_hint パラメーターをディクショナリに追加します (例:facebook.com)。
  4. 追加のクエリ パラメーター オブジェクトを、MSAL 構成オブジェクトの WithExtraQueryParameters メソッドに渡します。
Dictionary<string, string> extraQueryParameters = new Dictionary<string, string>();
extraQueryParameters.Add("domain_hint", "facebook.com");

authResult = await app.AcquireTokenInteractive(App.ApiScopes)
    .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
    .WithExtraQueryParameters(extraQueryParameters)
    .ExecuteAsync();

UI 言語を指定する

Azure AD B2C の言語のカスタマイズを使用すると、ユーザー フローで、顧客のニーズに合わせてさまざまな言語に対応できます。 詳細については、言語のカスタマイズに関する記事を参照してください。

優先する言語を設定するには、次のようにします。

  1. 言語のカスタマイズを構成します
  2. Dictionary オブジェクトを作成するか、既存のものを使用して、追加のクエリ パラメーターを格納します。
  3. 対応する言語コードが含まれる ui_locales パラメーターを、ディクショナリに追加します (例:en-us)。
  4. 追加のクエリ パラメーター オブジェクトを、MSAL 構成オブジェクトの WithExtraQueryParameters メソッドに渡します。
Dictionary<string, string> extraQueryParameters = new Dictionary<string, string>();
extraQueryParameters.Add("ui_locales", "en-us");

authResult = await app.AcquireTokenInteractive(App.ApiScopes)
    .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
    .WithExtraQueryParameters(extraQueryParameters)
    .ExecuteAsync();

カスタム クエリ文字列パラメーターを渡す

カスタム ポリシーを利用するとき、カスタム クエリ文字列パラメーターを渡すことができます。 ページ コンテンツを動的に変化させるときにお勧めです。

カスタム クエリ文字列パラメーターを渡すには、次の手順に従います。

  1. ContentDefinitionParameters 要素を構成します。
  2. Dictionary オブジェクトを作成するか、既存のものを使用して、追加のクエリ パラメーターを格納します。
  3. campaignId などのカスタム クエリ文字列パラメーターを追加します。 パラメーター値を設定します (例: germany-promotion )。
  4. 追加のクエリ パラメーター オブジェクトを、MSAL 構成オブジェクトの WithExtraQueryParameters メソッドに渡します。
Dictionary<string, string> extraQueryParameters = new Dictionary<string, string>();
extraQueryParameters.Add("campaignId", "germany-promotion");

authResult = await app.AcquireTokenInteractive(App.ApiScopes)
    .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
    .WithExtraQueryParameters(extraQueryParameters)
    .ExecuteAsync();

ID トークン ヒントを渡す

証明書利用者アプリケーションからは、OAuth2 認可要求の一部としてインバウンド JSON Web トークン (JWT) を送信できます。 インバウンド トークンは、ユーザーまたは認可要求に関するヒントです。 Azure AD B2C によってトークンが検証された後、クレームが抽出されます。

認証要求に ID トークン ヒントを含めるには、次のようにします。

  1. カスタム ポリシーで、ID トークン ヒントの技術プロファイルを定義します。
  2. コードで、ID トークンを生成または取得してから、そのトークンを変数に設定します (例: idToken)。
  3. Dictionary オブジェクトを作成するか、既存のものを使用して、追加のクエリ パラメーターを格納します。
  4. ID トークンを格納する、対応する変数が含まれる id_token_hint パラメーターを追加します。
  5. 追加のクエリ パラメーター オブジェクトを、MSAL 構成オブジェクトの extraQueryParameters 属性に渡します。
Dictionary<string, string> extraQueryParameters = new Dictionary<string, string>();
extraQueryParameters.Add("id_token_hint", idToken);

authResult = await app.AcquireTokenInteractive(App.ApiScopes)
    .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
    .WithExtraQueryParameters(extraQueryParameters)
    .ExecuteAsync();

ログの構成

MSAL ライブラリでは、問題の診断に役立つログ メッセージが生成されます。 アプリでログを構成できます。 また、このアプリでは、詳細なレベルや、個人データと組織データのどちらを記録するかをカスタム コントロールできます。

ユーザーが認証の問題を抱えている場合は、MSAL ログ コールバックを作成して、ユーザーがログを送信できるようにすることを推奨します。 MSAL では、以下のレベルのログ記録の詳細が提供されます。

  • エラー: 問題が発生し、エラーが生成されたことを示します。 このレベルは、問題をデバッグおよび特定するために使用されます。
  • 警告: 必ずしもエラーや障害があったわけではありませんが、診断や問題を特定するための情報です。
  • 情報: MSAL は、情報提供を目的としたイベントを記録しますが、必ずしもデバッグを目的としたものではありません。
  • 詳細: 既定のレベルです。 MSAL では、ライブラリの動作の詳細がログに記録されます。

既定では、MSAL ロガーによって、個人または組織のデータはキャプチャされません。 ライブラリには、個人と組織のデータをログ記録可能にした場合に、そのログ記録を有効にするオプションが用意されています。

次のコード スニペットでは、MSAL ログを構成する方法を示します。

PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
    .WithB2CAuthority(AuthoritySignUpSignIn)
    .WithRedirectUri(RedirectUri)
    .WithLogging(Log, LogLevel.Info, false) // don't log P(ersonally) I(dentifiable) I(nformation) details on a regular basis
    .Build();

リダイレクト URI を構成する

デスクトップ アプリの登録プロセスの過程でリダイレクト URI を選択する際には、以下の重要な点に注意してください。

  • 開発: 開発用途とデスクトップ アプリでは、リダイレクト URI を http://localhost に設定することができます。要求に含まれるすべてのポートが Azure AD B2C によって考慮されます。 登録された URI にポートが含まれている場合、そのポートのみが Azure AD B2C によって使用されます。 たとえば、登録されたリダイレクト URI が http://localhost である場合、要求におけるリダイレクト URI を http://localhost:<randomport> とすることができます。 登録されたリダイレクト URI が http://localhost:8080 である場合、要求におけるリダイレクト URI は http://localhost:8080 とする必要があります。
  • 一意:リダイレクト URI のスキームは、すべてのアプリケーションで一意である必要があります。 com.onmicrosoft.contosob2c.exampleapp://oauth/redirect の例では、com.onmicrosoft.contosob2c.exampleapp はスキームです。 このパターンに従う必要があります。 2 つのアプリケーションが同じスキームを共有している場合、ユーザーにはアプリケーションの選択権があります。 ユーザーが選択を誤った場合、サインインは失敗します。
  • 完全:リダイレクト URI には、スキームとパスの両方が必要です。 パスには、ドメインの後に少なくとも 1 つのスラッシュ文字を含める必要があります。 たとえば、//oauth/ は機能しますが、//oauth は失敗します。 URI に特殊文字を含めないでください。 たとえば、アンダースコア文字 (_) は使用できません。

次のステップ