
Microsoft Entra ID(旧 Azure AD)の Free で、ユーザー作成から手元アプリの SSO まで試す
どうも!オペ部の西村祐二です!
Microsoft Entra ID(旧 Azure Active Directory)を個人で触ってみたいと思っても、ドキュメントを読むだけでは分かりにくいところがあります。どこまで無料でできるのか、MFA はどう求められるのか、自分のアプリに SSO を組み込むと何が起きるのか、といった点です。
この記事では、Azure のアカウントに付いてくる Microsoft Entra ID Free のテナントで、次の流れを実際に試しました。
- テナントとライセンスを確認する
- テストユーザーとグループを作る
- テストユーザーで初めてサインインし、MFA を登録する
- アプリを登録し、手元で動かす Microsoft の Python サンプル(ms-identity-python-webapp)でサインイン(SSO)する
- アプリにサインインできるユーザーを割り当てで絞る
- サインインログで結果を確かめる
画面は、2026年10月17日時点の Microsoft Entra 管理センター(entra.microsoft.com)の日本語 UI です。一部の画面は英語で表示されました。画像では、メールアドレス、テナント名、各種 ID、IP アドレス、場所などを伏せています。条件付きアクセスなど P1 以上の機能は扱いません。
Entra ID Free でできること・できないこと
今回試した範囲で、Free で足りるかどうかを先にまとめます。
| 機能 | Free | 確認方法 |
|---|---|---|
| ユーザー・グループの作成 | 使える | 画面で作成 |
| セキュリティの既定値群による MFA | 使える | 画面で確認し、テストユーザーで MFA を登録 |
| アプリの登録とサインイン(SSO) | 使える | 手元のサンプルアプリ(ms-identity-python-webapp)でサインイン |
| アプリへのユーザーの個別割り当て | 使える | 画面で割り当て、未割り当てのユーザーが拒否されることを確認 |
| アプリへのグループ割り当て | P1 以上 | 画面に「グループを割り当てることができません」と表示。公式ドキュメントにも P1/P2 が必要と記載 |
| 動的メンバーシップのグループ(ユーザー対象) | P1 以上 | 公式ドキュメントに記載 |
| 条件付きアクセス | P1 以上 | ライセンスのドキュメントで確認 |
| サインインログ・監査ログの保持期間 | 7日(P1/P2 は30日) | データ保持期間のドキュメントで確認 |
個人で認証の流れを学んだり、手元のアプリに Entra ID のサインインを組み込んだりする用途であれば、Free で一通り試せました。グループ単位の割り当てや条件付きアクセスのように、組織で運用するときに使う機能から P1 が必要になります。料金はMicrosoft Entra の価格ページにまとまっています。
Entra ID Free のテナントを用意する
Azure の無料アカウントの条件
Entra ID Free は、Azure や Microsoft 365 などのサブスクリプションに含まれています。個人でゼロから始める場合は、Azure の無料アカウントを作るのが入口になります。ページの FAQ によると、要点は次のとおりです。
- 必要なものは、電話番号、プリペイドではないクレジットカードまたはデビットカード、Microsoft アカウントまたは GitHub アカウント
- USD$200 のクレジットを最大30日間使える
- 本人確認のため、カードに USD$1 の一時的な承認がかかることがある(認証後に取り消し)
- 従量課金制に移行しない限り課金されない。30日を過ぎるかクレジットを使い切ったあとに移行しなければ、アカウントとサービスは無効になる
無料アカウントは新規ユーザーだけが対象で、1人1つまでです。今回 GitHub アカウントでサインアップに進んだところ、以前に Azure を使ったことがあるアカウントだったため、次の画面が表示されました。

無料アカウントを作れなくても、以前に Azure を使ったときのテナントはそのまま残っています。Entra ID Free はテナントに付くものなので、今回はこの既存のテナントで進めました。
テナントとライセンスを確認する
Microsoft Entra 管理センターの「Entra ID」>「概要」を開くと、テナントの基本情報が表示されます。

名前は「既定のディレクトリ」、ライセンスは「Microsoft Entra ID Free」でした。プライマリドメインは <テナント名>.onmicrosoft.com 形式で、今回はサインアップに使ったメールアドレスをもとにした名前になっていました。
「ユーザー」>「すべてのユーザー」を見ると、自分のアカウントのユーザー プリンシパル名(UPN)が <アカウント>#EXT#@<テナント名>.onmicrosoft.com の形になっていました。Microsoft アカウントでサインアップしてテナントを作ったため、外部の ID としてテナントに登録されています。ユーザーの種類は「メンバー」で、ロールはグローバル管理者です。このあと作るテストユーザーは、テナントのドメインを持つ内部のユーザーです。

セキュリティの既定値群を確認する
「概要」>「プロパティ」の「セキュリティの既定値群の管理」を開くと、「有効 (推奨)」になっていました。

セキュリティの既定値群は、すべての新しいテナントで最初から有効になっている、Microsoft 推奨の基本設定です。ユーザーに MFA の登録を求めるなどの保護をまとめて適用します。Free でも使える機能で、このテナントでも有効になっているため、このあと作るテストユーザーにも MFA の登録が求められます。
テストユーザーとグループを作る
ユーザーを作る
「ユーザー」>「すべてのユーザー」>「新しいユーザー」>「新しいユーザーの作成」を開きます。メニューには「外部ユーザーの招待」もありますが、今回はテナント内のユーザーを作ります。

「基本」タブに次の値を入れて、「レビューと作成」から作成しました。
- ユーザー プリンシパル名:
test-user01(ドメインはテナントのonmicrosoft.com) - 表示名:
Test User 01 - パスワード: 「パスワードの自動生成」のまま
自動生成されたパスワードは、控えておきます(今回は 1Password に保存しました)。このパスワードは一時的なもので、初回のサインインで変更を求められます。
作成直後は一覧に反映されていませんでしたが、再読み込みすると2人目のユーザーとして表示されました。

グループを作る
「グループ」>「すべてのグループ」>「新しいグループ」から、セキュリティグループを作りました。

- グループの種類: セキュリティ
- グループ名:
entra-free-test-group - メンバーシップの種類: 割り当て済み
- メンバー: Test User 01
メンバーシップの種類の選択肢には「割り当て済み」「動的ユーザー」「動的デバイス」が表示されました。ただし、公式ドキュメントによると、動的メンバーシップのグループは、ユーザーを対象にする場合に P1 ライセンスが必要です。今回は動的グループを作成していません。
テストユーザーで初めてサインインする
テストユーザーで My Apps にサインインしました。管理者でサインインしているものとは別のブラウザセッションを使っています。
パスワードを更新する
一時パスワードでサインインすると、最初に「パスワードの更新」を求められました。

MFA を登録する
パスワードを更新すると、続けて「アカウントをセキュリティ保護しましょう」と表示され、MFA の登録に進みます。

セキュリティの既定値群には、以前は MFA の登録を14日間先延ばしできる猶予がありました。公式ドキュメントによると、この猶予は 2024年7月29日以降、新しいテナントでも既存のテナントでもなくなっています。今回も、初回のサインインでその場で登録を求められました。
画面は Microsoft Authenticator のインストールを案内しますが、「別の認証アプリを設定する」から、ほかの TOTP 対応アプリも登録できます。今回は 1Password のワンタイムパスワードを使いました。

「別の認証アプリを設定する」を選ぶと QR コードが表示されます。「Can't scan the QR code?」を開くと、アカウント名と秘密鍵がテキストで表示されるので、1Password のワンタイムパスワード欄に登録できます。

認証アプリが表示する6桁のコードを入力すると、登録が完了します。

管理者側で「ユーザー」> Test User 01 >「認証方法」を見ると、「ソフトウェア OATH トークン」が登録されていました。既定のサインイン方法は「OATH TOTP ワンタイム コード」です。

アプリを登録して手元のサンプルでサインインする
次に、Entra ID にアプリを登録し、手元の Mac で動かす Web アプリから、テストユーザーでサインインします。Web アプリには、Microsoft が Azure-Samples で公開している Python(Flask)のサンプル ms-identity-python-webapp を使いました。動かし方は後半の「サンプルアプリを動かす」で説明します。
サインインの流れ
図は自作した概念図で、公式の構成図ではありません。

ブラウザでサンプルアプリを開くと、アプリはブラウザを Entra ID のサインイン画面へリダイレクトします。ブラウザ側でサインインと同意を済ませると、ブラウザは認可コードを持ってアプリのリダイレクト URI に戻ります。アプリはその認可コードとクライアントシークレットを使って、Entra ID から ID トークンを受け取ります。割り当てを必須にした場合、割り当てのないユーザーは 3 のサインイン画面で止まり、アプリには戻りません。
アプリを登録する
「アプリの登録」>「新規登録」を開き、次の内容で登録しました。

- 名前:
entra-free-sample-webapp - サポートされているアカウントの種類: シングル テナントのみ - 既定のディレクトリ
- リダイレクト URI: プラットフォームは「Web」、URI は
http://localhost:5001/getAToken
サポートされているアカウントの種類の選択肢は、「シングル テナントのみ」「複数の Entra ID テナント」「任意の Entra ID テナント + 個人用 Microsoft アカウント」「個人用アカウントのみ」の4つでした。今回はテナント内のユーザーだけを対象にするので、シングルテナントを選びます。
サンプルの手順は 5000 番ポートを前提にしていますが、今回は 5001 にしました。今回の Mac(macOS 26.6.1)では、5000 番を AirPlay レシーバー(ControlCenter)が使っていたためです。5000 番を使っているプロセスは lsof -iTCP:5000 -sTCP:LISTEN で確認できます。
登録すると、アプリの概要画面が開きます。ここで「アプリケーション (クライアント) ID」と「ディレクトリ (テナント) ID」を控えます。

右側の「ローカル ディレクトリでのマネージド アプリケーション」のリンク先が、同時に作られたエンタープライズアプリケーションです。ユーザーの割り当ては、あとでこちらで設定します。
クライアントシークレットを作る
「証明書とシークレット」>「クライアント シークレット」>「新しいクライアント シークレット」から、シークレットを作りました。有効期限は既定の「推奨: 180 日 (6 か月)」のままです。

値をコピーして 1Password に保存しました。
サンプルアプリを動かす
サンプルは、Azure-Samples の ms-identity-python-webapp を使いました。README から公式クイックスタートにリンクされている Python の Web アプリのサンプルで、Flask と、MSAL for Python をラップした identity ライブラリで書かれています。
環境は macOS 26.6.1、Python 3.13.13 で、パッケージ管理に uv、シークレットの受け渡しに 1Password CLI(op)を使いました。
git clone https://github.com/Azure-Samples/ms-identity-python-webapp.git
cd ms-identity-python-webapp
uv venv
uv pip install -r requirements.txt
Flask 3.1.3、ms-identity-python 0.9.2、msal 1.39.0 が入りました。
設定は .env に書きます。サンプルの .env.sample.entra-id には AUTHORITY、CLIENT_ID、CLIENT_SECRET、REDIRECT_URI の項目があります。クライアントシークレットはファイルに残したくないので、.env には書かず、起動するときに 1Password から環境変数で渡しました。
AUTHORITY=https://login.microsoftonline.com/<ディレクトリ (テナント) ID>
CLIENT_ID=<アプリケーション (クライアント) ID>
REDIRECT_URI=http://localhost:5001/getAToken
CLIENT_SECRET="$(op read 'op://<vault>/<item>/<field>')" \
uv run flask run --debug --host=localhost --port=5001
1Password を使わない場合も、CLIENT_SECRET を環境変数で渡せば同じように動きます。REDIRECT_URI は、Entra ID に登録した URI と完全に一致させます。サンプルはこの URI のパスを、サインイン後に戻ってくるルートとして使います。
サンプルの画面には表示名しか出ません。ID トークンのクレームも見られるように、templates/index.html の Welcome 行の下に2行足しました。
<h2>Welcome {{ user.get("name") }}!</h2>
<h3>ID token claims</h3>
<pre>{{ user | tojson(indent=2) }}</pre>
テストユーザーでサインインする
テストユーザーのブラウザで http://localhost:5001/ を開くと、Entra ID のアカウント選択画面にリダイレクトされました。Test User 01 を選ぶと、初回は「要求されているアクセス許可」の同意画面が表示されました。

「このアプリケーションは Microsoft によって公開されたものではありません」と表示され、求められているアクセス許可は「View your basic profile」などでした。「承諾」を押すと、サンプルアプリに戻ります。

「Welcome Test User 01!」と ID トークンのクレームが表示されました。name と preferred_username はテストユーザーの情報、tid はテナント ID、aud はアプリのクライアント ID です。iss の末尾が /v2.0 なので、v2.0 エンドポイントのトークンです。画像では識別子に当たる値を伏せています。
サインインできるユーザーを割り当てで絞る
アプリを登録した直後は、テナント内のユーザーなら誰でもこのアプリにサインインできます。公式ドキュメントにあるとおり、エンタープライズアプリケーション側で「割り当てが必要」を有効にすると、割り当てたユーザーだけに絞れます。
Free ではグループを割り当てられない
「エンタープライズ アプリ」> entra-free-sample-webapp >「ユーザーとグループ」>「ユーザーまたはグループの追加」を開くと、次の表示が出ました。

選べるのはユーザーだけで、Free ではユーザーを1人ずつ割り当てることになります。ここでは追加せずに閉じました。
割り当てを必須にする
同じエンタープライズアプリの「プロパティ」で、「割り当てが必要ですか?」を「はい」にして保存しました。

まだ誰も割り当てていないので、テストユーザーは拒否されるはずでした。ところが、サインインし直してもそのままサインインできました。「ユーザーとグループ」を見ると、Test User 01 がすでに割り当て済みで、割り当てられたロールは「既定のアクセス」(Default Access)でした。

この割り当てを削除し、サンプルアプリからサインアウトしてもう一度サインインすると、今度は Entra ID のサインイン画面でエラーになりました。

表示されたメッセージは次のとおりです(ID とユーザー名は伏せています)。
AADSTS50105: Your administrator has configured the application entra-free-sample-webapp ('<id>') to block users unless they are specifically granted ('assigned') access to the application.
割り当てのないユーザーをブロックする設定になっている、という内容です。アプリには戻らず、Entra ID のサインイン画面で止まりました。
続けて「ユーザーまたはグループの追加」で Test User 01 を個別に割り当てると(ロールは Default Access)、再びサインインでき、クレームの画面まで表示されました。
なお、公式ドキュメントによると、割り当てを必須にしたアプリではユーザー本人による同意ができなくなります。今回はすでに同意済みだったので通りましたが、まだ同意していないユーザーで試す場合は、先に管理者の同意を付与しておく必要があります。
サインインログで確かめる
ここまでのサインインは、「Entra ID」>「監視と正常性」>「サインイン ログ」で確認できます。

上から、割り当て直したあとの「成功」、割り当てを外していたときの「失敗」(エラーコード 50105)が並んでいます。初回サインインのパスワード更新(50055)や MFA 登録(50072)、同意画面(65001)の途中なども「中断」として残っていました。ログが一覧に出るまでには数分かかりました。
Free ではサインインログの保持期間が7日なので、検証の記録を残したい場合は7日以内に確認しておきます。
片付け
検証で作ったものを、次の順で削除しました。
- 「アプリの登録」で
entra-free-sample-webappを開き、「削除」を選ぶ。「このアプリの登録を削除することによる影響を理解しています。」にチェックを入れて「削除」を押す - 「ユーザー」で
test-user01を、「グループ」でentra-free-test-groupを選んで削除する - 手元のサンプルアプリを止め、クローンしたリポジトリを消す
1Password に保存したパスワード、TOTP、クライアントシークレットも、不要になったら削除します。

アプリの登録を削除すると、エンタープライズアプリの一覧からも消えました。削除したアプリの登録は「削除されたアプリケーション」タブに、削除したユーザーは「削除済みのユーザー」に残ります。どちらも削除から30日以内なら復元でき、それを過ぎると完全に削除されます。
まとめ
- Azure の無料アカウントは1人1つまでで、以前に Azure を使ったことがあると作れません。ただ、そのときのテナントに Entra ID Free が付いているので、そこで試せます
- 新しいユーザーは、初回サインインでパスワードの更新と MFA の登録を求められます。MFA の14日間の猶予はなくなっています。Microsoft Authenticator のほか、「別の認証アプリ」から 1Password などの TOTP アプリも使えます
- Free のテナントでもアプリを登録でき、テストユーザーでサインインして ID トークンのクレームまで表示できました
- 割り当てを必須にすると、未割り当てのユーザーは
AADSTS50105で拒否されます。ただし、ユーザーが同意したあとは割り当て済みになっていることがあります。Free ではグループ単位で割り当てられず、ユーザーを1人ずつ割り当てます - サインインログには成功、失敗(50105)、中断がエラーコード付きで残ります。Free の保持期間は7日です
ユーザーの個別割り当てまでは Free で試せました。割り当てる人数が増えてグループ単位で管理したくなったときや、条件付きアクセスが必要になったときが、P1 を検討するタイミングです。







