本投稿は2026年2月時点の情報に基づいています。
最新情報は、Microsoft公式サイトをご確認ください。
はじめに
本投稿では、 SPA + Entra External ID の認証アプリにおける、バックエンドアプリを .NET で実装する場合の設定方法について説明します。
本投稿は、Azure AD B2C と Entra External ID の設定差分を扱う 記事シリーズの一部 として位置づけています。
Entra External ID のテナント設定や SPA(Vue.js) 側の実装、Java(Spring Boot) によるバックエンドアプリの実装については、以下のトップページにまとめていますのでご確認ください。
背景
AlesInfiny Maia/Maris1 では、Azure AD B2C を使用した認証サンプルを公開しています。
しかし、Azure AD B2C は2025 年 5 月に新規購入が終了し、 既存利用のサポート継続は少なくとも 2030 年 5 月まで と Microsoft から発表されているため2、後継の Entra External ID を利用した認証サンプルを公開しました。
Entra External ID サンプルは Azure AD B2C サンプルと同等の機能(サインアップ、サインイン)を持つよう構成されているのに加え、サインアウト機能を実装しています。
詳しい設定内容については、ダウンロードしたサンプルの README をご参照ください。
- AlesInfiny Maia (Java版)
- AlesInfiny Maris (.NET版)
- Entra External ID サンプル(今後追加予定)
- Azure AD B2C サンプル
本投稿では、Entra External ID を利用する際の Azure AD B2C との共通点や相違点について説明します。
要点
- Azure AD B2C と Entra External ID で共通のライブラリを利用して JWT 検証を実施可能
- 設定差分は主に JWT 検証の構成設定
想定するアプリケーションの動作
本投稿で想定しているアプリケーションの動作概要です。
既にサインアップしている前提で、認証が必要なページにアクセスしようとしています。
※実際は Microsoft 認証ライブラリ (MSAL) の使用によって、 OAuth 2.0 承認コードフロー with PKCE を実現しています。
バックエンドアプリの実装
Azure AD B2C との共通点
Entra External ID を使用する場合、Azure AD B2C と同様に Microsoft.Identity.Web を使用してアクセストークン(JWT) の検証を行います。
また、以下の実装の流れも Azure AD B2C を利用する場合と共通しています。
-
Program.csでの JWT 検証の設定 - 認証を必要とする API に対する
[Authorize]属性の付与 -
NSwag.AspNetCoreNSwag.MSBuildを利用した OpenAPI 仕様書への認証要否の反映
1. Program.cs での JWT 検証の設定
JWT 検証の構成設定のため appsettings.json に Entra External ID の設定値を記載し、アプリケーション起動時に Program.cs で登録します。
{
"EntraId": {
"Instance": "https://[テナントサブドメイン].ciamlogin.com/",
"TenantId": "[テナントID]",
"ClientId": "[SampleWebAPI のクライアント ID]"
}
}
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
using NSwag;
using NSwag.Generation.Processors.Security;
var builder = WebApplication.CreateBuilder(args); // (既存のコード)
builder.Services
.AddControllers()
.ConfigureApiBehaviorOptions(options =>
{
// Web API アクションメソッドにおいてエラーの型を指定しなかったときに
// 自動的に ProblemDetails へ変換されることを抑止します。
options.SuppressMapClientErrors = true;
});
// Open API ドキュメントの security scheme を有効化します。
builder.Services.AddOpenApiDocument(config =>
{
config.AddSecurity("Bearer", new OpenApiSecurityScheme
{
Type = OpenApiSecuritySchemeType.Http,
Scheme = JwtBearerDefaults.AuthenticationScheme,
BearerFormat = "JWT",
Description = "この API は Bearer トークンによる認証が必要です。",
});
config.OperationProcessors.Add(new AspNetCoreOperationSecurityScopeProcessor("Bearer"));
});
// Entra External ID 認証に必要な設定をインジェクションします。
+ builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
+ .AddMicrosoftIdentityWebApi(
+ options =>
+ {
+ builder.Configuration.Bind("EntraId", options);
+ options.TokenValidationParameters.NameClaimType = "name";
+ },
+ options => { builder.Configuration.Bind("EntraId", options); });
var app = builder.Build(); // (既存のコード)
// 認証を有効化します。
app.UseAuthentication();
app.UseAuthorization();
なお、本サンプルでは NSwag.AspNetCore NSwag.MSBuild を使用して、アプリケーションビルド時に OpenAPI 仕様書を自動生成しています。 Program.cs 中の以下の設定により、後述する [Authorize] 属性を付与した API に対して Bearer 認証が必要であることを OpenAPI 仕様書に反映します。
// Open API ドキュメントの security scheme を有効化します。
builder.Services.AddOpenApiDocument(config =>
{
config.AddSecurity("Bearer", new OpenApiSecurityScheme
{
Type = OpenApiSecuritySchemeType.Http,
Scheme = JwtBearerDefaults.AuthenticationScheme,
BearerFormat = "JWT",
Description = "この API は Bearer トークンによる認証が必要です。",
});
config.OperationProcessors.Add(new AspNetCoreOperationSecurityScopeProcessor("Bearer"));
});
以下のような OpenAPI 仕様書が生成されます。
2. 認証を必要とする API に対する属性の付与
認証を必要とする Web API に [Authorize] 属性を付与します。 [Authorize] 属性は Web API Controller クラスにも、個別のアクションメソッドにも付与できます。
using Microsoft.AspNetCore.Authorization;
+ [Authorize]
public class ExampleController : ControllerBase
{
// 省略
}
Azure AD B2C との相違点
Entra External ID では、アプリケーション起動時に必要となる設定項目が Azure AD B2C と異なります。
- Entra External ID の場合
{
"EntraId": {
"Instance": "https://[テナントサブドメイン].ciamlogin.com/",
"TenantId": "[テナントID]",
"ClientId": "[SampleWebAPI のクライアント ID]"
}
}
- Azure AD B2C の場合
上記コード例の通り、Entra External ID では Azure AD B2C と比較して以下の設定項目の違いがあります。
-
Instance- authority URL の形式を
*.ciamlogin.comに変更
- authority URL の形式を
-
TenantId- 新たに追加
-
Domain,SignUpSignInPolicyId- 不要となるため削除
おわりに
本投稿では SPA + Entra External ID の認証アプリにおける、バックエンドアプリを .NET で実装する場合の設定方法について説明しました。
Azure AD B2C を利用する場合とライブラリや属性付与は共通しており、主な差分は JWT 検証の構成設定値にとどまります。
ぜひ SPA 編と併せて Entra External ID を利用した認証アプリの導入の参考にしていただければ幸いです。
We Are Hiring!
-
AlesInfiny Maia/Maris は、 Java/.NET アプリケーションの標準的なアーキテクチャを提供します。
以下 Web サイトにて、ドキュメントおよびサンプルアプリケーションを公開しています。
https://maia.alesinfiny.org/
https://maris.alesinfiny.org/ ↩
