このチュートリアルでは、サインインしているユーザー (代理フローとも呼ばれます) を偽装して、Azure App Service アプリをバックエンドの Azure SQL データベースに接続する方法について説明します。 このフローを構成するには、Microsoft Entra ID プロバイダーを使用して App Service の組み込み認証 を有効にします。
この接続方法は、「チュートリアル: マネージド ID を使用してデータにアクセスする」の マネージド ID アプローチよりも高度であり、エンタープライズ シナリオでは次の利点があります。
- マネージド ID アプローチと同様に、バックエンド サービスへの接続シークレットを排除します。
- バックエンド データベースまたはその他の Azure サービスに、だれに付与するアクセス権をより詳細に制御できるかを提供します。
- サインインしているユーザーに合わせて、アプリがデータプレゼンテーションを調整できるようにします。
このチュートリアルでは、Azure SQL Database バックエンドを持つ .NET Web アプリに Microsoft Entra 認証を追加します。 次の方法を学びます:
- Azure SQL Database の Microsoft Entra 認証を有効にします。
- その他の SQL Database 認証オプションを無効にします。
- アプリの ID プロバイダーとして Microsoft Entra ID を追加します。
- SQL Database ユーザーの偽装アクセス許可を構成します。
- SQL Database の使用可能なアクセス トークンを提供するように App Service を構成します。
- サインインしている Microsoft Entra ユーザーの代わりに Azure SQL データベースにアクセスします。
チュートリアルを完了すると、サインインしているユーザーの代わりにアプリが SQL Database に安全に接続されます。
注
- Microsoft Entra ID は、オンプレミスの SQL Server ではサポートされていません。
- Microsoft Entra 認証は、オンプレミス Active Directory (AD) Domain Services (DS) の 統合 Windows 認証 とは異なります。 AD DS と Microsoft Entra ID はまったく異なる認証プロトコルを使用しています。 詳細については、「Microsoft Entra Domain Services のドキュメント」を参照してください。
前提条件
ユーザーとグループが設定された Microsoft Entra テナントにアクセスできます。
「チュートリアル: Azure App Service で ASP.NET Core と SQL Database アプリを構築する」のチュートリアルを完了し、このチュートリアルで完成したアプリを使用します。
または、手順を調整し、SQL Database で独自の .NET アプリを使用します。 このチュートリアルの手順では、次の .NET バージョンがサポートされています。
- .NET Framework 4.8 以降
- .NET 6.0 以降
Azure Cloud Shell にサインインするか、Azure CLI を使用するように環境を準備します。
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の概要」を参照してください。
CLI 参照コマンドをローカルで実行する場合は、Azure CLI を インストール します。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「 Azure CLI を使用した Azure への認証」を参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
1、Microsoft Entra 認証を使用してデータベース サーバーを構成する
Azure SQL サーバーの管理者として Microsoft Entra ユーザーを割り当てることで、Azure SQL データベースへの Microsoft Entra 認証を有効にします。 Microsoft Entra 管理者は、Microsoft Entra ID に作成、インポート、同期、または招待されたユーザーである必要があります。 Microsoft Entra ユーザーは、Azure サブスクリプションの Microsoft アカウント ユーザーと同じではない可能性があります。
Azure SQL サーバーの管理者として Microsoft Entra ID ユーザーを追加するには、次の Azure CLI コマンドを実行します。
az ad user listをdisplay-name、filter、またはupnパラメーターと共に使用して、管理者にする Microsoft Entra ID ユーザーのオブジェクト ID を取得します。たとえば、次のコマンドは、Firstname Lastname のdisplay-nameを持つ Microsoft Entra ID ユーザーの情報を一覧表示します。az ad user list --display-name "Firstname Lastname"出力から
id値をコピーして、次の手順で使用します。ヒント
スタンドアロン
az ad user list実行して、Microsoft Entra ディレクトリ内のすべてのユーザーの情報を表示できます。object-idパラメーターでaz sql server ad-admin createを使用して、Azure SQL サーバーの管理者として Microsoft Entra ID ユーザーを追加します。 次のコマンドでは、<group-name>をサーバーのリソース グループ名に置き換え、<server-name>サーバーの名前から.database.windows.netサフィックスを引いた名前に置き換え、<entra-id>前のaz ad user listコマンドからのid出力に置き換えます。az sql server ad-admin create --resource-group <group-name> --server-name <server-name> --display-name ADMIN --object-id <entra-id>データベース サーバー認証を Microsoft Entra 認証のみに制限します。 この手順では、SQL ユーザー名とパスワードの認証を無効にします。
az sql server ad-only-auth enable --resource-group <group-name> --name <server-name>
- Microsoft Entra ユーザーの作成の詳細については、「Microsoft Entra ID を使用してユーザーを追加または削除する」を参照してください。
- SQL Database で許可されている Microsoft Entra ユーザーの詳細については、SQL Database の Microsoft Entra の機能と制限事項に関する説明を参照してください。
- Azure SQL Server 管理者の追加の詳細については、サーバーの Microsoft Entra 管理者のプロビジョニングに関するページを参照してください。
2. アプリの Microsoft Entra ID 認証を有効にする
Microsoft Entra ID をアプリの ID プロバイダーとして追加します。 詳細については、「App Services アプリケーションの Microsoft Entra 認証を構成する」を参照してください。
アプリの Azure portal ページで、左側のナビゲーション メニューの [設定] で [認証] を選択します。
[認証] ページで、[ID プロバイダーの追加] を選択するか、[ID プロバイダー] セクションで [プロバイダーの追加] を選択します。
[ ID プロバイダーの追加 ] ページで、プロバイダーとして Microsoft を選択します。
[クライアント シークレットの有効期限] で、[推奨: 180 日] などのドロップダウン リスト オプションのいずれかを選択します。
すべての既定の設定をそのまま使用し、[追加] を選択 します。
注
アプリの認証設定を再構成すると、トークン ストア内のトークンが新しい設定から再生成されない可能性があります。 トークンが再生成されるようにするには、サインアウトしてアプリにサインインし直します。 簡単な方法は、プライベートモードでブラウザを使用することです。 アプリの設定を変更した後、ブラウザーをプライベート モードで閉じてから再度開きます。
3. SQL Database ユーザーの偽装を構成する
サインインしている Microsoft Entra ユーザーの代わりに SQL Database にアクセスするためのアクセス許可をアプリに付与します。
アプリの [認証 ] ページで、[ ID プロバイダー] でアプリ名を選択します。
アプリ登録ページが開きます。 この登録は、Microsoft Entra プロバイダーを追加したときに自動的に生成されました。
左側のナビゲーション メニューの [管理] で [API のアクセス許可] を選択します。
[API のアクセス許可] ページで、[アクセス許可の追加] を選択します。
[ API のアクセス許可の要求 ] 画面で、 組織が使用する API タブを選択します。
検索ボックスに 「Azure SQL Database 」と入力し、結果を選択します。
アプリケーションで必要なアクセス許可の種類で、[委任されたアクセス許可] を選択し、user_impersonationの横にあるチェック ボックスをオンにして、[アクセス許可の追加] を選択します。
Microsoft Entra でのアプリの登録には、サインインしているユーザーを偽装して SQL Database に接続するために必要なアクセス許可が付与されました。
4. 使用可能なアクセス トークンを返すように App Service を構成する
SQL Database の使用可能なアクセス トークンを提供するようにアプリを構成するには、アプリの Microsoft Entra プロバイダー loginParametersにscopeとしてhttps://database.windows.net/user_impersonationを追加します。 次のコマンドは、カスタム スコープを持つ loginParameters プロパティを Microsoft Entra ID プロバイダーの login 設定に追加します。
要求されたスコープのうち、App Service は既定で既に openid、 profile、および email スコープを要求しています。 トークンを更新できるように、 offline_access スコープが含まれています。 詳細については、「 OpenID Connect スコープ」を参照してください。
https://database.windows.net/user_impersonation スコープは Azure SQL Database を参照し、SQL Database をトークン受信者として指定する JSON Web トークン (JWT) を提供します。 このコマンドは、Cloud Shell に既にインストールされている JSON 処理に jq を使用します。
authSettings=$(az webapp auth show --resource-group <group-name> --name <app-name>)
authSettings=$(echo "$authSettings" | jq '.properties' | jq '.identityProviders.azureActiveDirectory.login += {"loginParameters":["scope=openid profile email offline_access https://database.windows.net/user_impersonation"]}')
az webapp auth set --resource-group <group-name> --name <app-name> --body "$authSettings"
ヒント
Azure CLI ではなく Web インターフェイスを使用して必要なスコープを構成するには、 Microsoft Entra プロバイダーを構成して更新トークンを提供し、要求されたスコープに https://database.windows.net/user_impersonation を追加します。
これで、SQL Database が受け入れるアクセス トークンを生成するようにアプリが構成されました。
注
アクセス トークンはしばらくすると期限切れになります。 ユーザーにアプリの再認証を要求せずにアクセス トークンを更新する方法については、「 認証トークンを更新する」を参照してください。
5. アプリケーション コードでアクセス トークンを使用する
アプリケーション コードを更新して、App Service 認証によって提供されるアクセス トークンを接続オブジェクトに追加します。
注
このコードはローカルでは機能しません。 ローカル デバッグの詳細と代替方法については、「 App Service 認証を使用する場合のローカルデバッグ」を参照してください。
データベース コンテキストを構成するDatabaseContext.csまたはその他のファイル内の
DbContextオブジェクトで、既定のコンストラクターを変更して、Microsoft Entra ID アクセス トークンを接続オブジェクトに追加します。public MyDatabaseContext (DbContextOptions<MyDatabaseContext> options, IHttpContextAccessor accessor) : base(options) { var conn = Database.GetDbConnection() as SqlConnection; conn.AccessToken = accessor.HttpContext.Request.Headers["X-MS-TOKEN-AAD-ACCESS-TOKEN"]; }ユーザー名とパスワードを使用して SQL 認証を使用する App Service で
defaultConnectionという接続文字列がある場合は、次のコマンドを使用して接続シークレットを削除します。<group-name>、<app-name>、<db-server-name>、<db-name>を実際の値に置き換えます。az webapp config connection-string set --resource-group <group-name> --name <app-name> --connection-string-type SQLAzure --settings defaultConnection="server=tcp:<db-server-name>.database.windows.net;database=<db-name>;"
6. 変更を発行する
ブラウザーで Visual Studio Code を使用して GitHub フォークでコードを変更した場合は、左側のメニューから [ソース管理 ] を選択します。
OBO connectなどのコミット メッセージを入力し、[コミット] を選択します。
コミットによって、App Service への GitHub Actions デプロイがトリガーされます。 デプロイが完了するまで数分間お待ちください。
次のコマンドを使用して、Git Bash で変更を発行することもできます。
git commit -am "configure managed identity"
git push azure main
コードが Visual Studio にある場合:
新しいアプリ ページにアプリが表示されると、サインインしている Microsoft Entra ユーザーの代わりにアプリが Azure SQL データベースに接続されます。 通常どおりにアプリを使用および編集できる必要があります。
7.リソースをクリーンアップする
前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが不要になったら、次のコマンドを実行してリソース グループを削除します。
az group delete --name <group-name>
このコマンドの実行には時間がかかる場合があります。
よくある質問
- "ユーザー '<トークンで識別されたプリンシパル>' のログインに失敗しました" というエラーが表示されるのはなぜですか?
- Azure SQL Database に他の Microsoft Entra ユーザーやグループを追加する操作方法
- App Service 認証を使用する場合にローカルでデバッグする操作方法
- アクセス トークンの有効期限が切れるとどうなりますか?
"ユーザー '<トークンで識別されたプリンシパル>' のログインに失敗しました" というエラーが表示されるのはなぜですか?
Login failed for user '<token-identified principal>' エラーの最も一般的な原因は次のとおりです。
- Microsoft Entra 認証が Azure SQL データベース用に構成されていません。 「Microsoft Entra 認証を使用してデータベース サーバーを構成する」を参照してください。
-
X-MS-TOKEN-AAD-ACCESS-TOKEN要求ヘッダーに有効なトークンがありません。 このコードは、ローカル環境では機能しません。 詳細と代替方法については、「 App Service 認証を使用する場合のローカルデバッグ」を参照してください。 - ユーザーには、データベースに接続するためのアクセス許可がありません。 ユーザーとアクセス許可を追加するには、「 Azure SQL Database で他の Microsoft Entra ユーザーまたはグループを追加する」を参照してください。
Azure SQL Database に他の Microsoft Entra ユーザーやグループを追加する操作方法
ユーザーまたはグループをさらに追加するには、 sqlcmd または SQL Server Management Studio (SSMS) を使用してデータベース サーバーに接続し、Microsoft Entra ID にマップされた 包含データベース ユーザー を作成します。
次の Transact-SQL 例では、Microsoft Entra ID を SQL Server に追加し、その ID に一部のデータベース ロールを付与します。
CREATE USER [<user-or-group-name>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<user-or-group-name>];
ALTER ROLE db_datawriter ADD MEMBER [<user-or-group-name>];
ALTER ROLE db_ddladmin ADD MEMBER [<user-or-group-name>];
GO
App Service 認証を使用する場合にローカルでデバッグする操作方法
App Service 認証は Azure の機能であるため、このチュートリアルのコードはローカル環境では機能しません。 Azure で実行されているアプリとは異なり、ローカル コードは App Service 認証ミドルウェアの恩恵を受けられません。 ローカル デバッグには、次の代替手段を使用できます。
-
Active Directory Interactive認証を使用してローカル環境から SQL Database に接続します。 この認証フローでは、ユーザー自体はサインインしませんが、サインインしているユーザーを使用してバックエンド データベースに接続するため、データベースの承認をローカルでテストできます。 -
X-MS-TOKEN-AAD-ACCESS-TOKEN要求ヘッダーの代わりに、アクセス トークンをコードに手動でコピーします。 - Visual Studio からデプロイする場合は、App Service アプリのリモート デバッグを使用します。
アクセス トークンの有効期限が切れるとどうなりますか?
アクセス トークンは、しばらくすると有効期限が切れます。 アプリに対する再認証をユーザーに強制することなくアクセス トークンを更新する方法については、「Refresh identity provider tokens (ID プロバイダー トークンの更新)」を参照してください。