重要
2025 年 5 月 1 日より、Azure AD B2C は新規のお客様向けに購入できなくなります。 詳細については、FAQ を参照してください。
この記事では、Web アプリケーションの Azure Active Directory B2C (Azure AD B2C) 認証エクスペリエンスを有効、カスタマイズ、および強化する方法について説明します。
開始する前に、次の記事を理解することが重要です。
カスタム ドメインの使用
カスタム ドメインを使用すると、認証 URL を完全にブランド化できます。 ユーザーの観点からは、ユーザーは Azure AD B2C b2clogin.com ドメイン名にリダイレクトされるのではなく、認証プロセス中もドメインに残ります。
URL 内の "b2c" へのすべての参照を削除するには、認証要求 URL の B2C テナント名 (contoso.onmicrosoft.com) をテナント ID GUID に置き換えることもできます。 たとえば、 https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/
を https://account.contosobank.co.uk/<tenant ID GUID>/
に変更できます。
認証 URL でカスタム ドメインとテナント ID を使用するには、「 カスタム ドメインを有効にする」のガイダンスに従います。 プロジェクトのルート フォルダーで、appsettings.json ファイルを開きます。 このファイルには、Azure AD B2C ID プロバイダーに関する情報が含まれています。
appsettings.json ファイルで、次の操作を行います。
- カスタム ドメインで
Instance
エントリを更新します。 -
Domain
で エントリを更新します。 詳細については、「 テナント ID の使用」を参照してください。
次の JSON は、変更前のアプリ設定を示しています。
"AzureAdB2C": {
"Instance": "https://contoso.b2clogin.com",
"Domain": "tenant-name.onmicrosoft.com",
...
}
次の JSON は、変更後のアプリ設定を示しています。
"AzureAdB2C": {
"Instance": "https://login.contoso.com",
"Domain": "00000000-0000-0000-0000-000000000000",
...
}
高度なシナリオをサポートする
Microsoft ID プラットフォーム API の AddMicrosoftIdentityWebAppAuthentication
メソッドを使用すると、開発者は高度な認証シナリオのコードを追加したり、OpenIdConnect イベントをサブスクライブしたりできます。 たとえば、OnRedirectToIdentityProvider をサブスクライブできます。これにより、アプリが Azure AD B2C に送信する認証要求をカスタマイズできます。
高度なシナリオをサポートするには、 Startup.cs ファイルを開き、 ConfigureServices
関数で AddMicrosoftIdentityWebAppAuthentication
を次のコード スニペットに置き換えます。
// Configuration to sign-in users with Azure AD B2C
//services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAdB2C");
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(options =>
{
Configuration.Bind("AzureAdB2C", options);
options.Events ??= new OpenIdConnectEvents();
options.Events.OnRedirectToIdentityProvider += OnRedirectToIdentityProviderFunc;
});
上記のコードは、 OnRedirectToIdentityProviderFunc
メソッドへの参照を持つ OnRedirectToIdentityProvider イベントを追加します。
Startup.cs
クラスに次のコード スニペットを追加します。
private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
// Custom code here
// Don't remove this line
await Task.CompletedTask.ConfigureAwait(false);
}
コンテキスト パラメーターを使用して、コントローラーと OnRedirectToIdentityProvider
関数の間でパラメーターを渡すことができます。
サインイン名を事前に入力する
サインイン ユーザー体験中に、アプリが特定のユーザーをターゲットにしている可能性があります。 アプリがユーザーを対象とする場合は、承認要求で、ユーザーのサインイン名を使用して login_hint
クエリ パラメーターを指定できます。 Azure AD B2C によってサインイン名が自動的に設定され、ユーザーはパスワードのみを指定する必要があります。
サインイン名を事前に入力するには、次の操作を行います。
カスタム ポリシーを使用している場合は、「 直接サインインの設定」の説明に従って、必要な入力要求を追加します。
サポートの 高度なシナリオの手順を完了します 。
OnRedirectToIdentityProvider
関数に次のコード行を追加します。private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { context.ProtocolMessage.LoginHint = "emily@contoso.com"; // More code await Task.CompletedTask.ConfigureAwait(false); }
ID プロバイダーを事前選択する
Facebook、LinkedIn、Google などのソーシャル アカウントを含むようにアプリケーションのサインイン体験を構成した場合は、 domain_hint
パラメーターを指定できます。 このクエリ パラメーターは、サインインに使用するソーシャル ID プロバイダーに関するヒントを Azure AD B2C に提供します。 たとえば、アプリケーションが domain_hint=facebook.com
を指定した場合、サインイン フローは Facebook サインイン ページに直接移動します。
ユーザーを外部 ID プロバイダーにリダイレクトするには、次の操作を行います。
外部 ID プロバイダーのドメイン名を確認します。 詳細については、「サインインをソーシャル プロバイダーにリダイレクトする」を参照してください。
サポートの 高度なシナリオの手順を完了します 。
OnRedirectToIdentityProviderFunc
関数で、OnRedirectToIdentityProvider
関数に次のコード行を追加します。private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { context.ProtocolMessage.DomainHint = "facebook.com"; // More code await Task.CompletedTask.ConfigureAwait(false); }
UI 言語を指定する
Azure AD B2C での言語のカスタマイズにより、ユーザー フローは顧客のニーズに合わせてさまざまな言語に対応できます。 詳細については、「言語の カスタマイズ」を参照してください。
優先する言語を設定するには、次の操作を行います。
サポートの 高度なシナリオの手順を完了します 。
OnRedirectToIdentityProvider
関数に次のコード行を追加します。private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { context.ProtocolMessage.UiLocales = "es"; // More code await Task.CompletedTask.ConfigureAwait(false); }
カスタム クエリ文字列パラメーターを渡す
カスタム ポリシーでは、カスタム クエリ文字列パラメーターを渡すことができます。 適切なユース ケースの例として、 ページコンテンツを動的に変更する場合があります。
カスタム クエリ文字列パラメーターを渡すには、次の操作を行います。
サポートの 高度なシナリオの手順を完了します 。
OnRedirectToIdentityProvider
関数に次のコード行を追加します。private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { context.ProtocolMessage.Parameters.Add("campaignId", "123"); // More code await Task.CompletedTask.ConfigureAwait(false); }
ID トークン ヒントを渡す
証明書利用者アプリケーションは、OAuth2 承認要求の一部として受信 JSON Web トークン (JWT) を送信できます。 受信トークンは、ユーザーまたは承認要求に関するヒントです。 Azure AD B2C はトークンを検証し、要求を抽出します。
認証要求に ID トークン ヒントを含めるには、次の操作を行います。
サポートの 高度なシナリオの手順を完了します 。
カスタム ポリシーで、 ID トークン ヒント技術プロファイルを定義します。
OnRedirectToIdentityProvider
関数に次のコード行を追加します。private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { // The idTokenHint variable holds your ID token context.ProtocolMessage.IdTokenHint = idTokenHint // More code await Task.CompletedTask.ConfigureAwait(false); }
アカウント コントローラー
SignIn、SignUp、または SignOut アクションをカスタマイズする場合は、独自のコントローラーを作成することをお勧めします。 独自のコントローラーを使用すると、コントローラーと認証ライブラリの間でパラメーターを渡すことができます。
AccountController
は、サインインアクションとサインアウト アクション Microsoft.Identity.Web.UI
処理する NuGet パッケージの一部です。 その実装は 、Microsoft Identity Web ライブラリで確認できます。
アカウント コントローラーを追加する
Visual Studio プロジェクトで、 Controllers フォルダーを右クリックし、新しいコントローラーを追加 します。 [MVC - 空のコントローラー] を選択し、MyAccountController.cs名前を指定します。
次のコード スニペットは、MyAccountController
アクションを使用したカスタム を示しています。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace mywebapp.Controllers
{
[AllowAnonymous]
[Area("MicrosoftIdentity")]
[Route("[area]/[controller]/[action]")]
public class MyAccountController : Controller
{
[HttpGet("{scheme?}")]
public IActionResult SignIn([FromRoute] string scheme)
{
scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
var redirectUrl = Url.Content("~/");
var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
return Challenge(properties, scheme);
}
}
}
_LoginPartial.cshtml ビューで、コントローラーへのサインイン リンクを変更します。
<form method="get" asp-area="MicrosoftIdentity" asp-controller="MyAccount" asp-action="SignIn">
Azure AD B2C ポリシー ID を渡す
次のコード スニペットは、MyAccountController
アクションと SignUp アクションを使用したカスタム を示しています。 このアクションは、 policy
という名前のパラメーターを認証ライブラリに渡します。 これにより、特定のアクションに対して正しい Azure AD B2C ポリシー ID を指定できます。
public IActionResult SignIn([FromRoute] string scheme)
{
scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
var redirectUrl = Url.Content("~/");
var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
properties.Items["policy"] = "B2C_1_SignIn";
return Challenge(properties, scheme);
}
public IActionResult SignUp([FromRoute] string scheme)
{
scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
var redirectUrl = Url.Content("~/");
var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
properties.Items["policy"] = "B2C_1_SignUp";
return Challenge(properties, scheme);
}
_LoginPartial.cshtml ビューで、サインアップやプロファイルの編集など、その他の認証リンクのasp-controller
にMyAccountController
の値を変更します。
カスタム パラメーターを渡す
次のコード スニペットは、MyAccountController
アクションを使用したカスタム を示しています。 このアクションは、 campaign_id
という名前のパラメーターを認証ライブラリに渡します。
public IActionResult SignIn([FromRoute] string scheme)
{
scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
var redirectUrl = Url.Content("~/");
var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
properties.Items["policy"] = "B2C_1_SignIn";
properties.Items["campaign_id"] = "1234";
return Challenge(properties, scheme);
}
サポートの 高度なシナリオ の手順を完了し、 OnRedirectToIdentityProvider
メソッドでカスタム パラメーターを読み取ります。
private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
// Read the custom parameter
var campaign_id = context.Properties.Items.FirstOrDefault(x => x.Key == "campaign_id").Value;
// Add your custom code here
if (campaign_id != null)
{
// Send parameter to authentication request
context.ProtocolMessage.SetParameter("campaign_id", campaign_id);
}
await Task.CompletedTask.ConfigureAwait(false);
}
ログアウトのリダイレクトをセキュリティで保護する
ログアウト後、ユーザーは、アプリケーションに指定された応答 URL に関係なく、 post_logout_redirect_uri
パラメーターで指定された URI にリダイレクトされます。 ただし、有効な id_token_hint
が渡され、 ログアウト要求で ID トークンが必要 な場合、Azure AD B2C は、 post_logout_redirect_uri
の値が、リダイレクトを実行する前に、アプリケーションの構成済みのリダイレクト URI のいずれかに一致することを確認します。 アプリケーションに一致する応答 URL が構成されていない場合は、エラー メッセージが表示され、ユーザーはリダイレクトされません。
アプリケーションでセキュリティで保護されたログアウト リダイレクトをサポートするには、まず アカウント コントローラー と サポートの高度なシナリオ に関するセクションの手順に従います。 次に、次の手順に従います。
MyAccountController.cs
コントローラーで、次のコード スニペットを使用して SignOut アクションを追加します。[HttpGet("{scheme?}")] public async Task<IActionResult> SignOutAsync([FromRoute] string scheme) { scheme ??= OpenIdConnectDefaults.AuthenticationScheme; //obtain the id_token var idToken = await HttpContext.GetTokenAsync("id_token"); //send the id_token value to the authentication middleware properties.Items["id_token_hint"] = idToken; return SignOut(properties,CookieAuthenticationDefaults.AuthenticationScheme,scheme); }
Startup.cs クラスで、
id_token_hint
値を解析し、認証要求に値を追加します。 次のコード スニペットは、認証要求にid_token_hint
値を渡す方法を示しています。private async Task OnRedirectToIdentityProviderForSignOutFunc(RedirectContext context) { var id_token_hint = context.Properties.Items.FirstOrDefault(x => x.Key == "id_token_hint").Value; if (id_token_hint != null) { // Send parameter to authentication request context.ProtocolMessage.SetParameter("id_token_hint", id_token_hint); } await Task.CompletedTask.ConfigureAwait(false); }
ConfigureServices
関数で、SaveTokens
値にアクセスできる Controllers のid_token
オプションを追加します。services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { Configuration.Bind("AzureAdB2C", options); options.Events ??= new OpenIdConnectEvents(); options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc; options.SaveTokens = true; });
appsettings.json 構成ファイルで、ログアウト リダイレクト URI パスをキー
SignedOutCallbackPath
追加します。"AzureAdB2C": { "Instance": "https://<your-tenant-name>.b2clogin.com", "ClientId": "<web-app-application-id>", "Domain": "<your-b2c-___domain>", "SignedOutCallbackPath": "/signout/<your-sign-up-in-policy>", "SignUpSignInPolicyId": "<your-sign-up-in-policy>" }
上記の例では、ログアウト要求に渡される post_logout_redirect_uri は次の形式になります: https://your-app.com/signout/<your-sign-up-in-policy>
。 この URL は、アプリケーション登録の応答 URL に追加する必要があります。
ロールベースのアクセス制御
ASP.NET Core での承認を使用すると、次のいずれかの方法を使用して、保護されたリソースへのアクセスがユーザーに許可されているかどうかを確認できます。
ConfigureServices
メソッドで、承認モデルを追加する AddAuthorization
メソッドを追加します。 次の例では、 EmployeeOnly
という名前のポリシーを作成します。 ポリシーは、要求 EmployeeNumber
が存在することを確認します。 要求の値は、1、2、3、4、または 5 のいずれかの ID である必要があります。
services.AddAuthorization(options =>
{
options.AddPolicy("EmployeeOnly", policy =>
policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
});
AuthorizationAttribute とそのさまざまなパラメーターを使用して、ASP.NET Core で承認を制御します。 最も基本的な形式では、 Authorize
属性をコントローラー、アクション、または Razor ページに適用すると、そのコンポーネントの認証済みユーザーへのアクセスが制限されます。
ポリシーをコントローラーに適用するには、ポリシー名と共に Authorize
属性を使用します。 次のコードでは、Claims
ポリシーによって承認されたユーザーに対するEmployeeOnly
アクションへのアクセスを制限します。
[Authorize(Policy = "EmployeeOnly")]
public IActionResult Claims()
{
return View();
}
次のステップ
- 承認の詳細については、「 ASP.NET Core での承認の概要」を参照してください。