チュートリアル: サインインしているユーザーの代わりに App Service アプリを SQL Database に接続する

このチュートリアルでは、Microsoft Entra 認証プロバイダーを使用して App Service アプリで組み込み認証を有効にし、サインインしているユーザーを借用して (On-Behalf-Of フローとも呼ばれます) バックエンド Azure SQL Database に接続して拡張する方法について説明します。 これは、「チュートリアル: マネージド ID を使用してデータにアクセスする」よりもさらに高度な接続アプローチであり、エンタープライズ シナリオでは次のような利点があります。

  • マネージド ID アプローチと同様に、バックエンド サービスへの接続シークレットを排除します。
  • バックエンド データベース (またはその他の Azure サービス) が、データと機能へのアクセスを誰にどの程度許可するかを、より詳細に制御できます。
  • サインインしているユーザーに合わせて、アプリがデータプレゼンテーションを調整できるようにします。

このチュートリアルでは、次のいずれかのチュートリアルでデプロイしたサンプル Web アプリに、Microsoft Entra 認証を追加します。

完了すると、サンプル アプリはサインインしているユーザーの代わりに、SQL Database に接続するユーザーを安全に認証します。

Architecture diagram for tutorial scenario.

Note

このチュートリアルで説明する手順は、以下のバージョンをサポートしています。

  • .NET Framework 4.8 以降
  • .NET 6.0 以降

学習内容

  • Azure SQL Database の組み込み認証を有効にする
  • Azure SQL Database の他の認証オプションを無効にする
  • App Service 認証を有効にする
  • ID プロバイダーとして Microsoft Entra ID を使用する
  • サインインしている Microsoft Entra ユーザーの代わりに Azure SQL Database にアクセスする

Note

Microsoft Entra 認証は、オンプレミスの Active Directory (AD DS) の統合 Windows 認証とは異なります。 AD DS と Microsoft Entra ID はまったく異なる認証プロトコルを使用しています。 詳細については、「Microsoft Entra Domain Services のドキュメント」を参照してください。

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

前提条件

この記事は、次のいずれかのチュートリアルで中断したところに続きます。

まだどちらも完了していない場合は、先に 2 つのチュートリアルのうちのいずれかに従って作業してください。 または、SQL Database を使用して独自の .NET アプリに合わせた手順を実行することもできます。

Azure CLI の環境を準備します。

Azure では、ブラウザーを介して使用できる対話型のシェル環境、Azure Cloud Shell がホストされています。 Cloud Shell で Bash または PowerShell を使用して、Azure サービスを操作できます。 ローカル環境に何もインストールしなくても、Cloud Shell にプレインストールされているコマンドを使用して、この記事のコードを実行できます。

Azure Cloud Shell を開始するには、以下のようにします。

オプション 例とリンク
コードまたはコマンド ブロックの右上隅にある [使ってみる] を選択します。 [使ってみる] を選択しても、コードまたはコマンドは Cloud Shell に自動的にはコピーされません。 Screenshot that shows an example of Try It for Azure Cloud Shell.
https://shell.azure.com に移動するか、[Cloud Shell を起動する] ボタンを選択して、ブラウザーで Cloud Shell を開きます。 Button to launch Azure Cloud Shell.
Azure portal の右上にあるメニュー バーの [Cloud Shell] ボタンを選択します。 Screenshot that shows the Cloud Shell button in the Azure portal

Azure Cloud Shell を使用するには、以下のようにします。

  1. Cloud Shell を開始します。

  2. コード ブロック (またはコマンド ブロック) の [コピー] ボタンを選択し、コードまたはコマンドをコピーします。

  3. Windows と Linux では Ctrl+Shift+V キーを選択し、macOS では Cmd+Shift+V キーを選択して、コードまたはコマンドを Cloud Shell セッションに貼り付けます。

  4. Enter キーを選択して、コードまたはコマンドを実行します。

1、Microsoft Entra 認証を使用してデータベース サーバーを構成する

まず、Microsoft Entra ユーザーをサーバーの管理者として割り当てることで、SQL Databaseへの Microsoft Entra 認証を有効にします。 このユーザーは、ご使用の Azure サブスクリプションのサインアップに使用した Microsoft アカウントと異なります。 Microsoft Entra ID に作成、インポート、同期、または招待したユーザーである必要があります。 許可されている Microsoft Entra ユーザーの詳細については、「Microsoft Entra の機能と SQL データベースの制限事項」を参照してください。

  1. Microsoft Entra テナントにまだユーザーが作成されていない場合は、「Microsoft Entra ID を使用してユーザーを追加または削除する」の手順に従ってユーザーを作成します。

  2. az ad user list を使用して Microsoft Entra ユーザーのオブジェクト ID を見つけ、<user-principal-name> を置き換えます。 結果は変数に保存されます。

    azureaduser=$(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query [].id --output tsv)
    

    ヒント

    Microsoft Entra ID 内のすべてのユーザー プリンシパル名の一覧を表示するには、az ad user list --query [].userPrincipalName を実行します。

  3. Cloud Shell で az sql server ad-admin create コマンドを使用して、この Microsoft Entra ユーザーを Active Directory 管理者として追加します。 次のコマンドで、<server-name> を、サーバー名 (.database.windows.net サフィックスなし) に置き換えます。

    az sql server ad-admin create --resource-group <group-name> --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    
  4. データベース サーバー認証を Active Directory 認証に制限します。 この手順により、SQL 認証が実質的に無効になります。

    az sql server ad-only-auth enable --resource-group <group-name> --server-name <server-name>
    

Active Directory 管理者の追加の詳細については「Microsoft Entra 管理者をプロビジョニングする (SQL Database)」を参照してください。

2. アプリのユーザー認証を有効にする

Microsoft Entra ID での認証をID プロバイダーとして有効にします。 詳細については、「App Services アプリケーションの Microsoft Entra 認証を構成する」を参照してください。

  1. [Azure portal] メニューで [リソース グループ] を選択するか、または任意のページから [リソース グループ] を検索して選択します。

  2. [リソース グループ] でリソース グループを検索して選び、アプリを選びます。

  3. アプリの左側のメニューで [認証] を選び、[ID プロバイダーの追加] を選びます。

  4. [ID プロバイダーの追加] ページで、Microsoft および Microsoft Entra ID にサインインするための ID プロバイダーとして [Microsoft] を選択します。

  5. 既定の設定をそのままにして [追加] を選びます。

    Screenshot showing the add identity provider page.

ヒント

エラーが発生してアプリの認証設定を再構成すると、トークン ストア内のトークンが新しい設定では再生成されないことがあります。 トークンが再生成されるようにするには、サインアウトしてからアプリにサインインし直す必要があります。 そのための簡単な方法は、ブラウザーをプライベート モードで使用し、アプリの設定を変更した後、ブラウザーを閉じてからプライベート モードでもう一度開くことです。

3. ユーザーの借用を SQL Database に構成する

現在、Azure アプリは、アプリ設定として管理されている SQL 認証 (ユーザー名とパスワード) を使用して SQL Database に接続します。 ^この手順では、サインインしている Microsoft Entra ユーザーの代わりに、SQL Database へのアクセス許可をアプリに付与します。

  1. アプリの [認証] ページで、[ID プロバイダー] の下からアプリ名を選びます。 このアプリの登録は自動的に生成されました。 左側のメニューから [API のアクセス許可] を選択します。

  2. [アクセス許可の追加] を選択し、 [所属する組織で使用している API] の順に選択します。

  3. 検索ボックスに「Azure SQL Database」と入力し、結果を選びます。

  4. Azure SQL Database の [API アクセス許可の要求] ページで、[委任されたアクセス許可][user_impersonation] を選び、次に [アクセス許可の追加] を選びます。

    Screenshot of the Request API permissions page showing Delegated permissions, user_impersonation, and the Add permission button selected.

4. 使用可能なアクセス トークンを返すように App Service を構成する

Microsoft Entra ID でのアプリの登録に、サインインしているユーザーを借用した SQL Database の接続に必要なアクセス許可が付与されました。 次に、使用可能なアクセス トークンを提供するように App Service アプリを構成します。

Cloud Shell で、アプリから次のコマンドを実行して、scope パラメーターを認証設定 identityProviders.azureActiveDirectory.login.loginParameters に追加します。

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"

このコマンドで実質的に、さらにカスタム スコープを付加した loginParameters プロパティが追加されます。 要求するスコープの説明を次に示します。

  • openidprofileemail は、既に既定で App Service によって要求されています。 詳細については、「OpenID Connect のスコープ」を参照してください。
  • https://database.windows.net/user_impersonation は Azure SQL Database を参照します。 これは、SQL Database をトークンの対象ユーザーとして含む、JWT トークンを提供するスコープです。
  • offline_access は、便宜上ここに含まれています (トークンを更新したい場合)。

ヒント

代わりに Web インターフェイスを使用して要求するスコープを構成するには、「認証トークンを更新する」の Microsoft の手順を参照してください。

これでアプリの構成は完了です。 アプリは、SQL Database が受け入れるトークンを生成できるようになりました。

5. アプリケーション コードでアクセス トークンを使用する

プロジェクトに従う手順は、Entity Framework (ASP.NET の既定値) と Entity Framework Core (既定の ASP.NET Core) の使用によって異なります。

  1. Visual Studio で、パッケージ マネージャー コンソールを開き、Entity Framework を更新します。

    Update-Package EntityFramework
    
  2. (Models/MyDbContext.cs 内の) DbContext オブジェクトで、次のコードを既定のコンストラクターに追加します。

    var conn = (System.Data.SqlClient.SqlConnection)Database.Connection;
    conn.AccessToken = System.Web.HttpContext.Current.Request.Headers["X-MS-TOKEN-AAD-ACCESS-TOKEN"];
    

Note

このコードにより、App Service 認証から提供されるアクセス トークンが、接続オブジェクトに追加されます。

このコード変更はローカルでは機能しません。 詳しくは、「App Service 認証を使用する場合にローカルでデバッグする操作方法」をご覧ください。

6. 変更を発行する

  1. チュートリアル: Azure SQL Database を使用して Azure に ASP.NET アプリを構築する」から来た場合は、ユーザー名とパスワードで SQL 認証を使用して App Service に接続文字列を設定してあります。 次のコマンドを使用して接続シークレットを削除しますが、<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 MyDbConnection="server=tcp:<db-server-name>.database.windows.net;database=<db-name>;"
    
  2. Visual Studio で変更を発行します。 ソリューション エクスプローラーDotNetAppSqlDb プロジェクトを右クリックし、 [発行] を選択します。

    Screenshot showing how to publish from the Solution Explorer in Visual Studio.

  3. 発行ページで [発行] をクリックします。

新しい Web ページに To Do リストが表示されると、アプリはサインインしている Microsoft Entra ユーザーの代わりにデータベースに接続しています。

Azure app after Code First Migration

以前と同様に To-Do リストを編集できるようになりました。

7.リソースをクリーンアップする

前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが将来必要になると想定していない場合、Cloud Shell で次のコマンドを実行して、リソース グループを削除します。

az group delete --name <group-name>

このコマンドの実行には、少し時間がかかる場合があります。

よくある質問

Login failed for user '<token-identified principal>'. エラーが表示される理由

このエラーの最も一般的な原因は次のとおりです。

Azure SQL Database に他の Microsoft Entra ユーザーやグループを追加する操作方法

  1. sqlcmdSSMS などを使用して、データベース サーバーに接続します。

  2. SQL Database ドキュメントの手順で Microsoft Entra ID にマップされる包含ユーザーを作成します

    次の Transact-SQL の例では、SQL Server に Microsoft Entra の 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 要求ヘッダーの代わりに、https://<app-name>.azurewebsites.net/.auth/me からアクセス トークンを手動でコードにコピーします。
  • Visual Studio からデプロイする場合は、App Service アプリのリモート デバッグを使用します。

アクセス トークンの有効期限が切れるとどうなりますか?

アクセス トークンは、しばらくすると有効期限が切れます。 アプリに対する再認証をユーザーに強制することなくアクセス トークンを更新する方法については、「Refresh identity provider tokens (ID プロバイダー トークンの更新)」を参照してください。

次のステップ

ここで学習した内容は次のとおりです。

  • Azure SQL Database の組み込み認証を有効にする
  • Azure SQL Database の他の認証オプションを無効にする
  • App Service 認証を有効にする
  • ID プロバイダーとして Microsoft Entra ID を使用する
  • サインインしている Microsoft Entra ユーザーの代わりに Azure SQL Database にアクセスする