MSAL.NET を使用してソーシャル ID でユーザーをサインインさせるUse MSAL.NET to sign in users with social identities

MSAL.NET を使用して、Azure Active Directory B2C (Azure AD B2C) でソーシャル ID を持つユーザーをサインインさせることができます。You can use MSAL.NET to sign in users with social identities by using Azure Active Directory B2C (Azure AD B2C). Azure AD B2C はポリシーの概念を基に構築されています。Azure AD B2C is built around the notion of policies. MSAL.NET では、ポリシーを指定するということは、機関を提供することです。In MSAL.NET, specifying a policy translates to providing an authority.

  • パブリック クライアント アプリケーションをインスタンス化するときは、機関の一部としてポリシーを指定する必要があります。When you instantiate the public client application, you need to specify the policy as part of the authority.
  • ポリシーを適用するときは、authority パラメーターを受け取る AcquireTokenInteractive のオーバーライドを呼び出します。When you want to apply a policy, call an override of AcquireTokenInteractive that accepts the authority parameter.

この記事は、MSAL.NET 3.x に適用されます。This article applies to MSAL.NET 3.x. MSAL.NET 2.x については、GitHub の MSAL.NET Wiki にある「MSAL 2.x での Azure AD B2C の詳細」を参照してください。For MSAL.NET 2.x, see Azure AD B2C specifics in MSAL 2.x in the MSAL.NET Wiki on GitHub.

Azure AD B2C のテナントとポリシーに対する機関Authority for an Azure AD B2C tenant and policy

Azure AD B2C 機関の形式は次のとおりです。https://{azureADB2CHostname}/tfp/{tenant}/{policyName}The authority format for Azure AD B2C is: https://{azureADB2CHostname}/tfp/{tenant}/{policyName}

  • azureADB2CHostname - Azure AD B2C テナントの名前にホストを組み合わせたものです。azureADB2CHostname - The name of the Azure AD B2C tenant plus the host. たとえば、contosob2c.b2clogin.com です。For example, contosob2c.b2clogin.com.
  • tenant - Azure AD B2C テナントのドメイン名またはディレクトリ (テナント) ID。tenant - The domain name or the directory (tenant) ID of the Azure AD B2C tenant. たとえば、それぞれ contosob2c.onmicrosoft.com または GUID などです。For example, contosob2c.onmicrosoft.com or a GUID, respectively.
  • policyName - 適用するユーザー フローまたはカスタム ポリシーの名前。policyName - The name of the user flow or custom policy to apply. たとえば、b2c_1_susi のようなサインアップ/サインイン ポリシーです。For example, a sign-up/sign-in policy like b2c_1_susi.

Azure AD B2C 機関の詳細については、b2clogin.com へのリダイレクト URL の設定に関する記事を参照してください。For more information about Azure AD B2C authorities, see Set redirect URLs to b2clogin.com.

アプリケーションをインスタンス化するInstantiating the application

アプリケーション オブジェクトを作成する場合は、WithB2CAuthority() を呼び出して機関を指定する必要があります。Provide the authority by calling WithB2CAuthority() when you create the application object:

// Azure AD B2C Coordinates
public static string Tenant = "fabrikamb2c.onmicrosoft.com";
public static string AzureADB2CHostname = "fabrikamb2c.b2clogin.com";
public static string ClientID = "90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6";
public static string PolicySignUpSignIn = "b2c_1_susi";
public static string PolicyEditProfile = "b2c_1_edit_profile";
public static string PolicyResetPassword = "b2c_1_reset";

public static string AuthorityBase = $"https://{AzureADB2CHostname}/tfp/{Tenant}/";
public static string Authority = $"{AuthorityBase}{PolicySignUpSignIn}";
public static string AuthorityEditProfile = $"{AuthorityBase}{PolicyEditProfile}";
public static string AuthorityPasswordReset = $"{AuthorityBase}{PolicyResetPassword}";

application = PublicClientApplicationBuilder.Create(ClientID)
               .WithB2CAuthority(Authority)
               .Build();

ポリシーを適用するためのトークンを取得するAcquire a token to apply a policy

パブリック クライアント アプリケーションで Azure AD B2C で保護された API のトークンを取得するには、次のように、そのオーバーライドを機関で使用する必要があります。Acquiring a token for an Azure AD B2C-protected API in a public client application requires you to use the overrides with an authority:

IEnumerable<IAccount> accounts = await application.GetAccountsAsync();
AuthenticationResult ar = await application.AcquireTokenInteractive(scopes)
                                           .WithAccount(GetAccountByPolicy(accounts, policy))
                                           .WithParentActivityOrWindow(ParentActivityOrWindow)
                                           .ExecuteAsync();

上記のコード スニペットは、次のようになっています。In the preceding code snippet:

  • policy は、Azure AD B2C ユーザー フローまたはカスタム ポリシーの名前を含む文字列です (例: PolicySignUpSignIn)。policy is a string containing the name of your Azure AD B2C user flow or custom policy (for example, PolicySignUpSignIn).

  • ParentActivityOrWindow は、Android (Activity) では必須となります。親 UI (Microsoft Windows のウィンドウや iOS の UIViewController など) をサポートするその他のプラットフォームでは省略可能です。ParentActivityOrWindow is required for Android (the Activity) and is optional for other platforms that support a parent UI like windows on Microsoft Windows and UIViewController in iOS. UI ダイアログの詳細については、MSAL Wiki の「WithParentActivityOrWindow」を参照してください。For more information on the UI dialog, see WithParentActivityOrWindow on the MSAL Wiki.

  • GetAccountByPolicy(IEnumerable<IAccount>, string) は特定のポリシーのアカウントを検索するメソッドです。GetAccountByPolicy(IEnumerable<IAccount>, string) is a method that finds an account for a given policy. 次に例を示します。For example:

    private IAccount GetAccountByPolicy(IEnumerable<IAccount> accounts, string policy)
    {
        foreach (var account in accounts)
        {
            string userIdentifier = account.HomeAccountId.ObjectId.Split('.')[0];
            if (userIdentifier.EndsWith(policy.ToLower()))
                return account;
        }
        return null;
    }
    

現在、ユーザー フローまたはカスタム ポリシーの適用は (たとえば、ユーザーが自分のプロファイルを編集したり、パスワードをリセットしたりできるようにする)、AcquireTokenInteractive を呼び出すことによって行われます。Applying a user flow or custom policy (for example, letting the user edit their profile or reset their password) is currently done by calling AcquireTokenInteractive. これら 2 つのポリシーでは、返されたトークンや認証結果を使用しません。For these two policies, you don't use the returned token/authentication result.

プロファイルの編集ポリシーProfile edit policies

ユーザーがソーシャル ID でサインインし、自分のプロファイルを編集できるようにするには、Azure AD B2C EditProfile ポリシーを適用します。To enable your users to sign in with a social identity and then edit their profile, apply the Azure AD B2C edit profile policy.

そのためには、そのポリシーの機関を使用して AcquireTokenInteractive を呼び出します。Do so by calling AcquireTokenInteractive with the authority for that policy. ユーザーは既にサインインしていて、アクティブな Cookie セッションがあるため、Prompt.NoPrompt を使用して、[アカウントの選択] ダイアログが表示されないようにします。Because the user is already signed in and has an active cookie session, use Prompt.NoPrompt to prevent the account selection dialog from being displayed.

private async void EditProfileButton_Click(object sender, RoutedEventArgs e)
{
    IEnumerable<IAccount> accounts = await app.GetAccountsAsync();
    try
    {
        var authResult = await app.AcquireToken(scopes:App.ApiScopes)
                            .WithAccount(GetUserByPolicy(accounts, App.PolicyEditProfile)),
                            .WithPrompt(Prompt.NoPrompt),
                            .WithB2CAuthority(App.AuthorityEditProfile)
                            .ExecuteAsync();
        DisplayBasicTokenInfo(authResult);
    }
    catch
    {
    }
}

リソース所有者のパスワード資格情報 (ROPC)Resource owner password credentials (ROPC)

ROPC フローの詳細については、リソース所有者のパスワード資格情報の付与を使用したサインインに関する記事を参照してください。For more information on the ROPC flow, see Sign in with resource owner password credentials grant.

アプリケーションでユーザーにパスワードを求めることは安全でないため、ROPC フローは推奨されませんThe ROPC flow is not recommended because asking a user for their password in your application is not secure. この問題の詳細については、深刻化するパスワードの問題の解決策に関する記事を参照してください。For more information about this problem, see What’s the solution to the growing problem of passwords?.

ROPC フローでユーザー名とパスワードを使用すると、次のようなことが犠牲になります。By using username/password in an ROPC flow, you sacrifice several things:

  • 最新の ID の核となる概念:共有シークレットが傍受される可能性があるため、パスワードはフィッシングまたは再生される可能性があります。Core tenets of modern identity: The password can be fished or replayed because the shared secret can be intercepted. 定義上、ROPC はパスワードなしのフローと互換性がありません。By definition, ROPC is incompatible with passwordless flows.
  • MFA を実行する必要のあるユーザーがサインインできない (対話式操作がないため)。Users who need to do MFA won't be able to sign in (as there is no interaction).
  • ユーザーがシングル サインオン (SSO) を使用できない。Users won't be able to use single sign-on (SSO).

Azure AD B2C で ROPC フローを構成するConfigure the ROPC flow in Azure AD B2C

お使いの Azure AD B2C テナントで、新しいユーザー フローを作成し、 [ROPC を使用してサインイン] を選択して、ユーザー フローで ROPC を有効にします。In your Azure AD B2C tenant, create a new user flow and select Sign in using ROPC to enable ROPC for the user flow. 詳しくは、リソース所有者のパスワード資格情報フローの構成に関する記事をご覧ください。For more information, see Configure the resource owner password credentials flow.

IPublicClientApplication には AcquireTokenByUsernamePassword メソッドが含まれています。IPublicClientApplication contains the AcquireTokenByUsernamePassword method:

AcquireTokenByUsernamePassword(
            IEnumerable<string> scopes,
            string username,
            SecureString password)

この AcquireTokenByUsernamePassword メソッドは、次のパラメーターを受け取ります。This AcquireTokenByUsernamePassword method takes the following parameters:

  • アクセス トークンを取得する "スコープ"。The scopes for which to obtain an access token.
  • "ユーザー名"。A username.
  • ユーザーの SecureString の "パスワード"。A SecureString password for the user.

ROPC フローの制限事項Limitations of the ROPC flow

ROPC フローは、ユーザーがメール アドレスまたはユーザー名を使用して Azure AD B2C に登録したローカル アカウントでのみ動作しますThe ROPC flow only works for local accounts, where your users have registered with Azure AD B2C using an email address or username. Azure AD B2C によってサポートされる外部 ID プロバイダー (Facebook、Google など) とフェデレーションした場合、このフローは機能しません。This flow doesn't work when federating to an external identity provider supported by Azure AD B2C (Facebook, Google, etc.).

Google 認証と埋め込み Web ビューGoogle auth and embedded webview

ID プロバイダーとして Google を使用している 場合は、システム ブラウザーを使用することをお勧めします。Google では、埋め込み Web ビューから認証を行うことはできないためです。If you're using Google as an identity provider, we recommend you use the system browser as Google doesn't allow authentication from embedded webviews. 現在、login.microsoftonline.com は Google で信頼されている機関であり、埋め込み Web ビューで動作します。Currently, login.microsoftonline.com is a trusted authority with Google and will work with embedded webview. しかし、b2clogin.com は Google で信頼されている機関ではないため、ユーザーは認証を行うことができません。However, b2clogin.com is not a trusted authority with Google, so users will not be able to authenticate.

状況に変化があった場合、この問題に対する更新を提供します。We'll provide an update to this issue if things change.

MSAL.NET でのトークンのキャッシュToken caching in MSAL.NET

Azure AD B2C での既知の問題Known issue with Azure AD B2C

MSAL.NET ではトークン キャッシュがサポートされています。MSAL.NET supports a token cache. トークン キャッシュ キーは、ID プロバイダー (IdP) によって返される要求に基づきます。The token caching key is based on the claims returned by the identity provider (IdP).

現在、MSAL.NET では、トークン キャッシュ キーを作成するために 2 つの要求が必要です。Currently, MSAL.NET needs two claims to build a token cache key:

  • tid (Azure AD テナント ID)tid (the Azure AD tenant ID)
  • preferred_username

Azure AD B2C シナリオでは、これらの両方の要求が欠落する可能性があります。これは、すべてのソーシャル ID プロバイダー (Facebook、Google など) が、Azure AD B2C に返すトークンにそれらを返すわけではないからです。Both of these claims may be missing in Azure AD B2C scenarios because not all social identity providers (Facebook, Google, and others) return them in the tokens they return to Azure AD B2C.

このようなシナリオの症状として、Azure AD B2C によって発行されたトークンの preferred_username 要求の値にアクセスしたときに、MSAL.NET から Missing from the token response が返されることがあります。A symptom of such a scenario is that MSAL.NET returns Missing from the token response when you access the preferred_username claim value in tokens issued by Azure AD B2C. MSAL は、preferred_usernameMissing from the token response 値を使用して、ライブラリ間のキャッシュの相互互換性を維持します。MSAL uses the Missing from the token response value for preferred_username to maintain cache cross-compatibility between libraries.

対処方法Workarounds

テナント ID が見つからない場合の軽減策Mitigation for missing tenant ID

推奨される回避策は、前に説明したポリシーによるキャッシュを使用することです。The suggested workaround is to use caching by policy described earlier.

また、Azure AD B2C でカスタム ポリシーを使用している場合は、tid 要求を使用することもできます。Alternatively, you can use the tid claim if you're using custom policies in Azure AD B2C. カスタム ポリシーは、要求の変換を使用して、アプリケーションに追加の要求を返すことができます。Custom policies can return additional claims to your application by using claims transformation.

"トークンの応答にありません" の軽減策Mitigation for "Missing from the token response"

1 つの方法は、preferred_username ではなく name 要求を使用することです。One option is to use the name claim instead of preferred_username. Azure AD B2C によって発行された ID トークンに name 要求を含めるには、ユーザー フローを構成するときに表示名を選択します。To include the name claim in ID tokens issued by Azure AD B2C, select Display Name when you configure your user flow.

ユーザー フローによって返される要求を指定する方法の詳細については、「チュートリアル:Azure AD B2C 内にユーザーフローを作成する」を参照してください。For more information about specifying which claims are returned by your user flows, see Tutorial: Create user flows in Azure AD B2C.

次のステップNext steps

Azure AD B2C アプリケーション用に MSAL.NET を使用して対話形式でトークンを取得する詳細については、次のサンプルで提供されています。More details about acquiring tokens interactively with MSAL.NET for Azure AD B2C applications are provided in the following sample.

サンプルSample プラットフォームPlatform 説明Description
active-directory-b2c-xamarin-nativeactive-directory-b2c-xamarin-native Xamarin iOS、Xamarin Android、UWPXamarin iOS, Xamarin Android, UWP MSAL.NET を使用して Azure AD B2C 経由でユーザーを認証し、返されたトークンを使用して Web API にアクセスする Xamarin Forms アプリ。A Xamarin Forms app that uses MSAL.NET to authenticate users via Azure AD B2C and then access a web API with the tokens returned.