Azure Active Directory B2C を使用してユーザーを認証する

サンプルのダウンロードサンプルのダウンロード

Azure Active Directory B2C は、コンシューマー向けの Web アプリケーションとモバイル アプリケーション向けのクラウド ID 管理を提供します。 この記事では、Azure Active Directory B2C を使用して、Id 管理を Microsoft 認証ライブラリを使用してモバイル アプリケーションに統合する方法について説明します。

概要

Azure Active Directory B2C (ADB2C) は、コンシューマー向けアプリケーションの ID 管理サービスです。 これにより、ユーザーは既存のソーシャル アカウントまたはメールやユーザー名、パスワードなどのカスタム資格情報を使用してアプリケーションにサインインできます。 カスタム資格情報アカウントは、 ローカル アカウントと呼ばれます。

Azure Active Directory B2C ID 管理サービスをモバイル アプリケーションに統合するプロセスは次のとおりです。

  1. Azure Active Directory B2C テナントを作成する。
  2. モバイル アプリケーションを Azure Active Directory B2C テナントに登録します。
  3. サインアップとサインインのポリシーを作成し、パスワード を忘れたユーザー フロー。
  4. Microsoft Authentication Library (MSAL) を使用して、Azure Active Directory B2C テナントで認証ワークフローを開始します。

注意

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

Azure Active Directory B2C では、Microsoft、GitHub、Facebook、Twitter など、複数の ID プロバイダーがサポートされています。 Azure Active Directory B2C 機能の詳細については、「 Azure Active Directory B2C ドキュメント」を参照してください

Microsoft Authentication Library では、複数のアプリケーション アーキテクチャとプラットフォームがサポートされています。 MSAL 機能の詳細については、GitHub の Microsoft 認証ライブラリ に関するページを参照してください。

Azure Active Directory B2C テナントを構成する

サンプル プロジェクトを実行するには、Azure Active Directory B2C テナントを作成する必要があります。 詳細については、「Azure portalで Azure Active Directory B2C テナントを作成する」を参照してください。

テナントを作成したら、モバイル アプリケーションを構成するために テナント名テナント ID が 必要になります。 テナント ID と名前は、テナント URL の作成時に生成されたドメインによって定義されます。 生成されたテナント URL がテナント IDhttps://contoso20190410tenant.onmicrosoft.com/テナント名contoso20190410tenant.onmicrosoft.com であるcontoso20190410tenant場合。 上部のメニューでディレクトリとサブスクリプション フィルターをクリックして、Azure portalでテナント ドメインを見つけます。 次のスクリーンショットは、Azure ディレクトリとサブスクリプション フィルター ボタンとテナント ドメインを示しています。

Azure ディレクトリとサブスクリプション フィルター ビューのテナント名

サンプル プロジェクトで Constants.cs ファイルを編集して、 フィールドと tenantId フィールドをtenantName設定します。 次のコードは、テナント ドメインが の場合にこれらの値を設定する方法を示しています。これらの値を https://contoso20190410tenant.onmicrosoft.com/ポータルの値に置き換えます。

public static class Constants
{
    static readonly string tenantName = "contoso20190410tenant";
    static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
    ...
}

モバイル アプリケーションを Azure Active Directory B2C に登録する

モバイル アプリケーションは、ユーザーに接続して認証する前に、テナントに登録する必要があります。 登録プロセスでは、アプリケーションに一意の アプリケーション ID と 、認証後に応答をアプリケーションに戻す リダイレクト URL が 割り当てられます。 詳細については、「 Azure Active Directory B2C: アプリケーションを登録する」を参照してください。 アプリケーションに割り当てられている アプリケーション ID を 確認する必要があります。この ID は、プロパティ ビューのアプリケーション名の後に表示されます。 次のスクリーンショットは、アプリケーション ID を検索する場所を示しています。

Azure アプリケーションのプロパティ ビューのアプリケーション ID

Microsoft 認証ライブラリでは、アプリケーションの リダイレクト URLアプリケーション ID の前に "msal" というテキストが付き、その後に "auth" というエンドポイントが続く必要があります。 アプリケーション ID が "1234abcd" の場合、完全な URL は である msal1234abcd://auth必要があります。 次のスクリーンショットに示すように、アプリケーションで ネイティブ クライアント 設定が有効になっていることを確認し、アプリケーション ID を使用して カスタム リダイレクト URI を 作成します。

Azure アプリケーションのプロパティ ビューのカスタム リダイレクト URI

URL は、後で Android ApplicationManifest.xml と iOS Info.plist の両方で使用されます。

サンプル プロジェクトで Constants.cs ファイルを編集して、フィールドをclientIdアプリケーション ID に設定します。 次のコードは、アプリケーション ID 1234abcdが の場合にこの値を設定する方法を示しています。

public static class Constants
{
    static readonly string tenantName = "contoso20190410tenant";
    static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
    static readonly string clientId = "1234abcd";
    ...
}

サインアップ ポリシーとサインイン ポリシーを作成し、パスワード ポリシーを忘れた場合

ポリシーとは、アカウントの作成やパスワードのリセットなどのタスクを完了するためにユーザーが実行するエクスペリエンスです。 ポリシーでは、ユーザーがエクスペリエンスから戻ったときにアプリケーションが受け取るトークンの内容も指定します。 アカウントのサインアップとサインインの両方のポリシーを設定し、パスワードをリセットする必要があります。 Azure には、一般的なポリシーの作成を簡略化する組み込みのポリシーがあります。 詳細については、「 Azure Active Directory B2C: 組み込みポリシー」を参照してください。

ポリシーの設定が完了したら、Azure portalの [ユーザー フロー (ポリシー)] ビューに 2 つのポリシーが表示されます。 次のスクリーンショットは、Azure portalで構成された 2 つのポリシーを示しています。

Azure ユーザー フロー (ポリシー) ビューで構成された 2 つのポリシー

サンプル プロジェクトで Constants.cs ファイルを編集して、 フィールドと policyPassword フィールドを設定policySigninし、ポリシーのセットアップ時に選択した名前を反映させます。

public static class Constants
{
    static readonly string tenantName = "contoso20190410tenant";
    static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
    static readonly string clientId = "1234abcd";
    static readonly string policySignin = "B2C_1_signupsignin1";
    static readonly string policyPassword = "B2C_1_passwordreset";
    ...
}

認証に Microsoft 認証ライブラリ (MSAL) を使用する

Microsoft Authentication Library (MSAL) NuGet パッケージは、ソリューション内の共有、.NET Standard プロジェクト、およびプラットフォーム プロジェクトに追加する Xamarin.Forms 必要があります。 MSAL には、インターフェイスに PublicClientApplicationBuilder 従うオブジェクトを構築するクラスが IPublicClientApplication 含まれています。 MSAL では、 With 句を使用して、コンストラクターと認証方法に追加のパラメーターを指定します。

サンプル プロジェクトでは、App.xaml の分離コードによって と UIParentという名前AuthenticationClientの静的プロパティが定義され、コンストラクターで オブジェクトがインスタンス化AuthenticationClientされます。 句は WithIosKeychainSecurityGroup 、iOS アプリケーションのセキュリティ グループ名を提供します。 句は WithB2CAuthority 、ユーザーの認証に使用される既定の 機関 (ポリシー) を提供します。 句は WithRedirectUri 、複数の URI が指定されている場合に使用するリダイレクト URI を Azure Notification Hubs インスタンスに通知します。 次の例では、 をインスタンス化する方法を PublicClientApplication示します。

public partial class App : Application
{
    public static IPublicClientApplication AuthenticationClient { get; private set; }

    public static object UIParent { get; set; } = null;

    public App()
    {
        InitializeComponent();

        AuthenticationClient = PublicClientApplicationBuilder.Create(Constants.ClientId)
            .WithIosKeychainSecurityGroup(Constants.IosKeychainSecurityGroups)
            .WithB2CAuthority(Constants.AuthoritySignin)
            .WithRedirectUri($"msal{Constants.ClientId}://auth")
            .Build();

        MainPage = new NavigationPage(new LoginPage());
    }

    ...

注意

Azure Notification Hubs インスタンスにリダイレクト URI が 1 つだけ定義されている場合、 AuthenticationClient インスタンスは、 句で WithRedirectUri リダイレクト URI を指定せずに動作する可能性があります。 ただし、Azure 構成が拡張され、他のクライアントまたは認証方法がサポートされる場合は、常にこの値を指定する必要があります。

LoginPage.xaml.cs コードビハインドのイベント ハンドラーはOnAppearing、 を呼び出AcquireTokenSilentAsyncして、以前にログインしたユーザーの認証トークンを更新します。 認証プロセスは成功した場合に に LogoutPage リダイレクトされ、失敗した場合は何も行われません。 次の例は、 のサイレント再認証プロセスを OnAppearing示しています。

public partial class LoginPage : ContentPage
{
    ...

    protected override async void OnAppearing()
    {
        try
        {
            // Look for existing account
            IEnumerable<IAccount> accounts = await App.AuthenticationClient.GetAccountsAsync();

            AuthenticationResult result = await App.AuthenticationClient
                .AcquireTokenSilent(Constants.Scopes, accounts.FirstOrDefault())
                .ExecuteAsync();

            await Navigation.PushAsync(new LogoutPage(result));
        }
        catch
        {
            // Do nothing - the user isn't logged in
        }
        base.OnAppearing();
    }

    ...
}

OnLoginButtonClickedイベント ハンドラー ([ログイン] ボタンがクリックされたときに発生) は を呼び出しますAcquireTokenAsync。 MSAL ライブラリによってモバイル デバイス ブラウザーが自動的に開き、ログイン ページに移動します。 機関と呼ばれるサインイン URL は、Constants.cs ファイルで定義されているテナント名とポリシーの組み合わせです。 ユーザーが [パスワードを忘れた場合] オプションを選択した場合、パスワードを忘れた場合は例外としてアプリに返されます。これにより、パスワードを忘れた場合のエクスペリエンスが起動します。 次の例は、認証プロセスを示しています。

public partial class LoginPage : ContentPage
{
    ...

    async void OnLoginButtonClicked(object sender, EventArgs e)
    {
        AuthenticationResult result;
        try
        {
            result = await App.AuthenticationClient
                .AcquireTokenInteractive(Constants.Scopes)
                .WithPrompt(Prompt.SelectAccount)
                .WithParentActivityOrWindow(App.UIParent)
                .ExecuteAsync();

            await Navigation.PushAsync(new LogoutPage(result));
        }
        catch (MsalException ex)
        {
            if (ex.Message != null && ex.Message.Contains("AADB2C90118"))
            {
                result = await OnForgotPassword();
                await Navigation.PushAsync(new LogoutPage(result));
            }
            else if (ex.ErrorCode != "authentication_canceled")
            {
                await DisplayAlert("An error has occurred", "Exception message: " + ex.Message, "Dismiss");
            }
        }
    }

    ...
}

メソッドは OnForgotPassword サインイン プロセスに似ていますが、カスタム ポリシーを実装します。 OnForgotPassword では、 の別の AcquireTokenAsyncオーバーロードを使用します。これにより、特定の 機関を指定できます。 次の例は、トークンを取得するときにカスタム 機関 を指定する方法を示しています。

public partial class LoginPage : ContentPage
{
    ...
    async Task<AuthenticationResult> OnForgotPassword()
    {
        try
        {
            return await App.AuthenticationClient
                .AcquireTokenInteractive(Constants.Scopes)
                .WithPrompt(Prompt.SelectAccount)
                .WithParentActivityOrWindow(App.UIParent)
                .WithB2CAuthority(Constants.AuthorityPasswordReset)
                .ExecuteAsync();
        }
        catch (MsalException)
        {
            // Do nothing - ErrorCode will be displayed in OnLoginButtonClicked
            return null;
        }
    }
}

認証の最後の部分は、サインアウト プロセスです。 OnLogoutButtonClickedユーザーがサインアウト ボタンを押すと、 メソッドが呼び出されます。 すべてのアカウントをループ処理し、トークンが無効になっていることを確認します。 次のサンプルは、サインアウトの実装を示しています。

public partial class LogoutPage : ContentPage
{
    ...
    async void OnLogoutButtonClicked(object sender, EventArgs e)
    {
        IEnumerable<IAccount> accounts = await App.AuthenticationClient.GetAccountsAsync();

        while (accounts.Any())
        {
            await App.AuthenticationClient.RemoveAsync(accounts.First());
            accounts = await App.AuthenticationClient.GetAccountsAsync();
        }

        await Navigation.PopAsync();
    }
}

iOS

iOS では、Azure Active Directory B2C に登録されたカスタム URL スキームを Info.plist に登録する必要があります。 MSAL では、URL スキームが特定のパターンに準拠することを想定しています。前に「 Azure Active Directory B2C にモバイル アプリケーションを登録する」で説明されています。 次のスクリーンショットは、 Info.plist のカスタム URL スキームを示しています。

MSAL には、次のスクリーンショットに示すように、 Entitilements.plist に登録されている iOS のキーチェーンエンタイトルメントも必要です。

Azure Active Directory B2C が承認要求を完了すると、登録済みのリダイレクト URL にリダイレクトされます。 カスタム URL スキームでは、iOS がモバイル アプリケーションを起動し、起動パラメーターとして URL を渡します。ここで、アプリケーションAppDelegateのクラスのオーバーライドによってOpenUrl処理され、MSAL にエクスペリエンスの制御が返されます。 実装を OpenUrl 次のコード例に示します。

using Microsoft.Identity.Client;

namespace TodoAzure.iOS
{
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        ...
        public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
        {
            AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url);
            return base.OpenUrl(app, url, options);
        }
    }
}

Android

Android では、Azure Active Directory B2C に登録されたカスタム URL スキームを AndroidManifest.xmlに登録する必要があります。 MSAL では、URL スキームが特定のパターンに準拠することを想定しています。前に「 Azure Active Directory B2C にモバイル アプリケーションを登録する」で説明されています。 次の例は、 AndroidManifest.xmlのカスタム URL スキームを示しています。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.xamarin.adb2cauthorization">
  <uses-sdk android:minSdkVersion="15" />
  <application android:label="ADB2CAuthorization">
    <activity android:name="microsoft.identity.client.BrowserTabActivity">
      <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- example -->
        <!-- <data android:scheme="msalaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" android:host="auth" /> -->
        <data android:scheme="INSERT_URI_SCHEME_HERE" android:host="auth" />
      </intent-filter>
    </activity>"
  </application>
</manifest>

クラスは MainActivity 、呼び出し中にアプリケーションに UIParent オブジェクトを提供するように変更する OnCreate 必要があります。 Azure Active Directory B2C が承認要求を完了すると、 AndroidManifest.xmlから登録済みの URL スキームにリダイレクトされます。 登録された URI スキームの結果、Android は、URL を起動パラメーターとしてメソッドを呼び出します OnActivityResult 。このメソッドは メソッドによって SetAuthenticationContinuationEventArgs 処理されます。

public class MainActivity : FormsAppCompatActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(bundle);

        Forms.Init(this, bundle);
        LoadApplication(new App());
        App.UIParent = this;
    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
    }
}

ユニバーサル Windows プラットフォーム

ユニバーサル Windows プラットフォームで MSAL を使用するために追加のセットアップは必要ありません

プロジェクトを実行する

仮想デバイスまたは物理デバイスでアプリケーションを実行します。 [ ログイン ] ボタンをタップすると、ブラウザーが開き、サインインまたはアカウントを作成できるページに移動します。 サインイン プロセスが完了すると、アプリケーションのログアウト ページに戻ります。 次のスクリーンショットは、Android と iOS で実行されているユーザーサインイン画面を示しています。