Azure App Service は、Azure で高度にスケーラブルで自己修正型の Web ホスティング サービスを提供します。 App Service では、アプリの マネージド ID も提供されます。これは、 Azure SQL やその他の Azure サービスへのアクセスをセキュリティで保護するためのターンキー ソリューションです。 App Service のマネージド ID は、接続文字列内の資格情報などのシークレットを排除することで、アプリの安全性を高めます。
このチュートリアルでは、Azure SQL バックエンドを持つサンプル .NET アプリにマネージド ID を追加する方法について説明します。 完了すると、アプリはユーザー名とパスワードを必要とせずに、Azure SQL データベースに安全に接続できます。
このチュートリアルでは、次の操作を行います。
- マネージド ID を有効にします。
- マネージド ID へのアクセス権を Azure SQL Database に付与します。
- SQL Database で Microsoft Entra 認証を使用するように Entity Framework を構成します。
- Microsoft Entra 認証を使用して Visual Studio から SQL Database に接続します。
Node.js、Python、Java フレームワークでの Azure Database for MySQL または Azure Database for PostgreSQL の使用に関するガイダンスについては、「 チュートリアル: マネージド ID を使用してシークレットなしで App Service から Azure データベースに接続する」を参照してください。
注
Microsoft Entra ID とマネージド ID は、オンプレミスの SQL Server ではサポートされていません。
Microsoft Entra 認証は、オンプレミス Active Directory (AD) Domain Services (DS) の 統合 Windows 認証 とは異なります。 AD DS と Microsoft Entra ID はまったく異なる認証プロトコルを使用しています。 詳細については、「Microsoft Entra Domain Services のドキュメント」を参照してください。
前提条件
-
Azure アカウントをお持ちでない場合は、開始する前に無料アカウントを作成してください。
SQL 認証をバックエンドとして Azure SQL Database を使用する基本的な Azure App Service ASP.NET MVC または ASP.NET Core MVC create-read-update-delete (CRUD) アプリを用意します。 このチュートリアルの手順では、次の .NET バージョンがサポートされています。
- .NET Framework 4.8 以降
- .NET 6.0 以降
開発環境でアプリをデバッグできるように、コンピューターから Azure へのクライアント接続を許可します。 クライアント IP アドレスは、「 Azure portal を使用してサーバー レベルの IP ファイアウォール規則を管理する」の手順に従って追加できます。
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 を実行します。
Microsoft Entra ユーザーにデータベース管理者アクセス権を付与する
Azure SQL サーバーの管理者として Microsoft Entra ユーザーを割り当てることで、Azure SQL データベースへの Microsoft Entra 認証を有効にします。 Microsoft Entra 管理者は、Microsoft Entra ID に作成、インポート、同期、または招待されたユーザーである必要があります。 このユーザーは、Azure サブスクリプションの Microsoft アカウント ユーザーと同じではない可能性があります。
- Microsoft Entra ユーザーの作成の詳細については、「Microsoft Entra ID を使用してユーザーを追加または削除する」を参照してください。
- SQL Database で許可されている Microsoft Entra ユーザーの詳細については、SQL Database の Microsoft Entra の機能と制限事項に関する説明を参照してください。
- Azure SQL Server 管理者の追加の詳細については、サーバーの Microsoft Entra 管理者のプロビジョニングに関するページを参照してください。
Azure Cloud Shell の Bash 環境で、または Azure CLI にローカルでサインインした後に、次のコマンドを実行します。
az ad user list
をdisplay-name
、filter
、またはupn
パラメーターと共に使用して、管理者にする Microsoft Entra ID ユーザーのオブジェクト ID を取得します。スタンドアロンaz ad user list
実行して、Microsoft Entra ディレクトリ内のすべてのユーザーの情報を表示します。たとえば、次のコマンドは、Firstname Lastname の
display-name
を持つ Microsoft Entra ID ユーザーの情報を一覧表示します。az ad user list --display-name "Firstname Lastname"
出力例を次に示します:
"businessPhones": [], "displayName": "Firstname Lastname", "givenName": null, "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", "jobTitle": null, "mail": "firstname@contoso.com", "mobilePhone": null, "officeLocation": null, "preferredLanguage": null, "surname": null, "userPrincipalName": "firstname@contoso.com"
object-id
パラメーターでaz sql server ad-admin create
を使用して、Azure SQL サーバーの管理者として Microsoft Entra ID ユーザーを追加します。 次のコマンドでは、<server-name>
をサーバー名から.database.windows.net
サフィックスを引いた値に置き換え、<entra-id>
前のaz ad user list
コマンドの出力のid
値に置き換えます。az sql server ad-admin create --resource-group myResourceGroup --server-name <server-name> --display-name ADMIN --object-id <entra-id>
アプリのマネージド ID 接続を設定する
次の手順では、システム割り当てマネージド ID を使用して Azure SQL Database に接続するようにアプリを構成します。 ユーザー割り当て ID を使用するには、「 チュートリアル: マネージド ID を使用してシークレットなしで App Service から Azure データベースに接続する」を参照してください。
アプリのマネージド ID を有効にする
Azure アプリのマネージド ID を有効にするには、 az webapp identity assign コマンドを使用して、 <app-name>
をアプリ名に置き換えます。 システム割り当て ID の名前は、常にアプリ名と同じです。
az webapp identity assign --resource-group myResourceGroup --name <app-name>
出力の例を次に示します。
{
"additionalProperties": {},
"principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "SystemAssigned"
}
デプロイ スロットのマネージド ID を有効にするには、上記のコマンドに--slot <slot-name>
を追加し、<slot-name>
のスロットの名前を使用します。 デプロイ スロットのシステム割り当て ID の名前は <app-name>/slots/<slot-name>
。
また、ID を Microsoft Entra グループに追加し、その ID ではなく Microsoft Entra グループへのアクセス権を SQL Database に付与することもできます。 Microsoft Entra グループのアクセス許可を付与するには、グループの表示名を使用します。 次のコマンドは、マネージド ID の例を myAzureSQLDBAccessGroup
という新しいグループに追加します。
$groupid=(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
$msiobjectid=(az webapp identity show --resource-group myResourceGroup --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
マネージド ID にアクセス許可を付与する
アプリに必要な最小限のアクセス許可を ID に付与します。
PowerShell コマンド ラインを開き、次の SQLCMD コマンドを使用して SQL Database にサインインします。
<server-name>
をサーバー名に置き換え、<db-name>
をデータベース名に置き換え、<admin-user>
前のaz ad user list
コマンドの出力の管理者ユーザーのuserPrincipalName
に置き換えます。sqlcmd -S <servername>.database.windows.net -d <db-name> -U <admin-user> -G -l 30
画面の指示に従ってサインインします。
SQL プロンプトで、次のコマンドを実行して、データベースに必要な最小限のアクセス許可をアプリに付与します。
<identity-name>
を、アプリ名と同じ Microsoft Entra ID のマネージド ID の名前に置き換えます。CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [<identity-name>]; ALTER ROLE db_datawriter ADD MEMBER [<identity-name>]; ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>]; GO
注
バックエンド マネージド ID サービスは、期限切れになった場合にのみターゲット リソースのトークンを更新するトークン キャッシュを保持 します。 アプリで最初にトークンを取得した後に SQL Database のアクセス許可を変更しようとすると、キャッシュされたトークンの有効期限が切れるまで、更新されたアクセス許可を持つ新しいトークンは取得されません。
元の接続文字列を削除する
web.configまたはappsettings.json で行った変更は、マネージド ID と連携します。 アプリを初めてデプロイしたときに使用した元の接続文字列を削除できます。 接続文字列を削除するには、次の Azure CLI コマンドを実行し、 <app-name>
をアプリの名前に置き換え、 <connection-string-name>
を接続文字列の名前に置き換えます。
az webapp config connection-string delete --resource-group myResourceGroup --name <app-name> --setting-names <connection-string-name>
開発環境を設定する
選択した開発環境を設定し、Azure にサインインします。 Microsoft Entra 認証用に開発環境を設定する方法の詳細については.NET 用 Azure Identity クライアント ライブラリに関するページを参照してください。
Visual Studio for Windows は Microsoft Entra 認証と統合されています。
- Visual Studio で開発とデバッグを有効にするには、上部のメニューから [ファイル>アカウント設定 ] を選択して、Visual Studio で Microsoft Entra ユーザーを追加し、[ サインイン ] または [追加] を選択します。
- Azure サービス認証に Microsoft Entra ユーザーを設定するには、上部のメニューから [ツール>Options ] を選択し、[ Azure サービス認証>アカウントの選択] を選択します。 追加した Microsoft Entra ユーザーを選択し、[OK] を選択してください。
プロジェクトを変更してアプリを発行する
Azure SQL データベースベースの Web アプリでは、データベース コンテキストを使用してデータベースに接続します。 Microsoft Entra 認証を使用してアプリを操作するには、最新の Microsoft.Data.SqlClient ADO.NET プロバイダーに依存する Entity Framework SQL Server プロバイダーを参照するようにデータベース コンテキストを更新する必要があります。
Entity Framework プロバイダーは、組み込みの System.Data.SqlClient
SQL Server プロバイダーに代わるものであり、Microsoft Entra ID 認証方法のサポートが含まれています。 詳細については、「 Microsoft.EntityFramework.SqlServer」を参照してください。
[DbConfigurationType(typeof(MicrosoftSqlDbConfiguration))]
はデータベース コンテキストにMicrosoft.Data.SqlClient
を使用するためにローカルで動作しますが、System.Data.SqlClient
は Azure App Service のプロバイダーとしてハードコーディングされているため、System.Data.SqlClient
参照をMicrosoft.Data.SqlClient
にリダイレクトするには、MicrosoftSqlDbConfiguration
を拡張する必要があります。 手順は、ASP.NET アプリと ASP.NET Core アプリのどちらがあるかによって異なります。
ASP.NET Core アプリでは、既定で Entity Framework Core が使用されます。
Visual Studio パッケージ マネージャー コンソールで、NuGet パッケージ Microsoft.Data.SqlClient を追加します。
Install-Package Microsoft.Data.SqlClient
appsettings.jsonで、接続文字列の値を次のコードに置き換え、
<server-name
と<database-name>
をサーバー名とデータベース名に置き換えます。"Server=tcp:<server-name>.database.windows.net;Authentication=Active Directory Default; Database=<database-name>;"
注
Active Directory の既定の認証は、ローカル コンピューターと Azure App Service の両方で使用できます。 ドライバーは、いくつかの異なる方法で Microsoft Entra ID からトークンを取得できます。
アプリが展開されている場合、ドライバーはアプリのシステム割り当てマネージド ID からトークンを取得します。 接続文字列に
User Id=<client-id-of-user-assigned-managed-identity>;
を含める場合、ドライバーはユーザー割り当てマネージド ID で認証することもできます。DefaultAzureCredential
クラスは、トークンをメモリにキャッシュし、有効期限が切れる前に Microsoft Entra ID からトークンを取得します。 トークンを更新するためのカスタム コードは必要ありません。Visual Studio でデバッグするときに Azure SQL Database に接続するために必要なものがすべて揃いました。 コードでは、開発環境を設定するときに構成した Microsoft Entra ユーザーを使用します。
アプリを実行します。 ブラウザーの CRUD アプリは、Microsoft Entra 認証を使用して Azure SQL データベースに直接接続します。 この設定により、Visual Studio からのデータベースの移行を実行できます。
次の Git コマンドを使用して変更を発行します。
git commit -am "configure managed identity" git push azure main
アプリをテストする
新しい Web ページに To-Do リストを表示するとき、アプリはマネージド ID を使用してデータベースに接続しています。
to-do リストを編集できるようになりました。
リソースをクリーンアップする
前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが将来必要になると想定していない場合、Cloud Shell で次のコマンドを実行して、リソース グループを削除します。
az group delete --name myResourceGroup
このコマンドの実行には、少し時間がかかる場合があります。