チュートリアル: マネージド ID を使用してシークレットなしで .NET App Service から SQL Database に接続する

App Service では、Azure の高度にスケーラブルな自己適用型の Web ホスティング サービスを提供しています。 さらに、Azure SQL Database やその他の Azure サービスへのアクセスをセキュリティ保護するためのターンキー ソリューションであるマネージド ID もアプリ向けに提供しています。 App Service のマネージド ID を使用すると、接続文字列内の認証情報などのシークレットをアプリから排除することで、アプリのセキュリティを強化できます。 このチュートリアルでは、次のチュートリアルのいずれかで構築したサンプル Web アプリにマネージド ID を追加します。

作業が完了すると、サンプル アプリは、ユーザー名とパスワードを必要とせずに SQL Database に安全に接続するようになります。

チュートリアルのシナリオを表すアーキテクチャ図。

Note

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

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

他の言語フレームワーク (Node.js、Python、Java) での Azure Database for MySQL または Azure Database for PostgreSQL のガイダンスについては、「チュートリアル: マネージド ID を使用してシークレットなしで App Service から Azure データベースに接続する」を参照してください。

学習内容

  • マネージド ID を有効にする
  • SQL Database へのアクセスをマネージド ID に付与する
  • SQL Database で Microsoft Entra 認証を使用するように Entity Framework を構成する
  • Microsoft Entra 認証を使用して Visual Studio から 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 アプリに合わせた手順を実行することもできます。

SQL Database をバックエンドとして使用してご自分のアプリをデバッグするには、ご使用のコンピューターからのクライアント接続を許可していることを確認してください。 そうなっていない場合は、「Azure portal を使用してサーバーレベルの IP ファイアウォール規則を管理する」の手順に従ってください。

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

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

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 myResourceGroup --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    

Active Directory 管理者の追加の詳細については、サーバーの Microsoft Entra 管理者のプロビジョニングに関するセクションを参照してください

2. 開発環境の設定

  1. Visual Studio for Windows は Microsoft Entra 認証と統合されています。 Visual Studio で開発とデバッグを有効にするには、メニューから [ファイル]>[アカウント設定] を選択し、[サインイン] または [追加] を選択して、Visual Studio で Microsoft Entra ユーザーを追加してください。

  2. Azure サービス認証用に Microsoft Entra ユーザーを設定するには、メニューから [ツール]>[オプション] の順に選択した後、[Azure サービス認証]>[アカウントの選択] の順に選択してください。 追加した Microsoft Entra ユーザーを選択し、[OK] を選択してください。

Microsoft Entra 認証用に開発環境を設定する方法の詳細については.NET 用 Azure Identity クライアント ライブラリに関するページを参照してください。

これで、Microsoft Entra 認証を使用し、SQL Database をバックエンドとして利用して、ご自分のアプリを開発およびデバッグする準備ができました。

3. プロジェクトの変更

Note

Microsoft.Azure.Services.AppAuthentication は、新しい Azure SDK での使用は非推奨になりました。 これは、.NET、Java、TypeScript、Python 向けに提供されている新しい Azure ID クライアント ライブラリに置き換えられています。新規の開発ではすべて、これを使用する必要があります。 Azure Identity への移行方法の詳細については、Azure Identityに関する記事を参照してください。

プロジェクトに従う手順は、Entity Framework Core (ASP.NET Core の既定値) または Entity Framework (ASP.NET の既定値) のどちらを使用しているかによって異なります。

  1. Visual Studio で、パッケージ マネージャー コンソールを開き、次のように NuGet パッケージ Microsoft.Data.SqlClient を追加します。

    Install-Package Microsoft.Data.SqlClient -Version 5.1.0
    
  2. ASP.NET Coreおよび SQL Databaseのチュートリアルでは、appsettings.jsonMyDbConnection接続文字列はまだ使用されていません。 ローカル環境と Azure 環境は、接続シークレットをソース ファイルから除外するために、それぞれの環境変数から接続文字列を取得します。 しかし、現在は Active Directory 認証を使用して、これ以上のシークレットはありません。 appsettings.json で、MyDbConnection 接続文字列の値を次のように置き換えます。

    "Server=tcp:<server-name>.database.windows.net;Authentication=Active Directory Default; Database=<database-name>;"
    

    Note

    Active Directory の既定値認証の種類は、ローカル コンピューターと Azure アプリ サービスの両方で使用できます。 ドライバーは、さまざまな手段を使用して Microsoft Entra ID からトークンを取得しようとします。 アプリが展開されている場合、アプリのシステム割り当てマネージド ID からトークンを取得します。 接続文字列に User Id=<client-id-of-user-assigned-managed-identity>; を含める場合、ユーザー割り当てマネージド ID で認証することもできます。 アプリがローカルで実行されている場合は、Visual Studio、Visual Studio コード、および Azure CLI からトークンを取得しようとします。

    これが、SQL Database に接続するために必要な作業のすべてです。 Visual Studio でデバッグする場合、コードでは 「2. 開発環境のセットアップ」で構成した Microsoft Entra ユーザーが使用されます。 後で、App Service アプリのマネージド ID からの接続を許可するように SQL Database を設定します。 DefaultAzureCredential クラスは、トークンをメモリ内にキャッシュし、有効期限の直前に Microsoft Entra ID から取得します。 トークンを更新するためのカスタム コードは必要ありません。

  3. Ctrl+F5 キーを押してアプリをもう一度実行します。 これで、お使いのブラウザー内で同じ CRUD アプリが Microsoft Entra 認証を使用して Azure SQL Database に直接接続します。 この設定により、Visual Studio からのデータベースの移行を実行できます。

4. マネージド ID 接続の使用

次に、システムによって割り当てられたマネージド ID を使用して SQL Database に接続するよう、ご自分の App Service アプリを構成します。

Note

このセクションの手順はシステム割り当て ID を対象としています。ユーザー割り当て ID を使用するには、「チュートリアル: マネージド ID を使用してシークレットなしで App Service から Azure データベースに接続する」を参照してください。

アプリのマネージド ID を有効にする

Azure アプリのマネージド ID を有効にするには、Cloud Shell で az webapp identity assign コマンドを使用します。 次のコマンドの <app name> を置き換えます。

az webapp identity assign --resource-group myResourceGroup --name <app-name>

Note

デプロイ スロットのマネージド ID を有効にするには、--slot <slot-name> を追加し、<slot-name> にスロットの名前を使用します。

出力の例を次に示します。

{
  "additionalProperties": {},
  "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
  "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
  "type": "SystemAssigned"
}

マネージド ID にアクセス許可を付与する

Note

必要に応じて、Microsoft Entra グループに ID を追加し、SQL Database へのアクセスを ID ではなく 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
  1. Cloud Shell 内で、SQLCMD コマンドを使用して SQL Database にサインインします。 <server-name> をお使いのサーバー名に置き換え、<db-name> をご自分のアプリが使用するデータベースの名前に置き換え、<aad-user-name><aad-password> をお使いの Microsoft Entra ユーザーの資格情報に置き換えてください。

    sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
    
  2. 対象のデータベースの SQL プロンプトで次のコマンドを実行して、ご自分のアプリに必要な最小限のアクセス許可を付与します。 たとえば、 にします。

    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
    

    <identity-name> は、Microsoft Entra ID でのマネージド ID の名前です。 ID がシステムによって割り当てられる場合は常に、App Service アプリと同じ名前になります。 デプロイ スロットの場合、システムによって割り当てられた ID の名前は、<app-name>/slots/<slot-name> です。 Microsoft Entra グループのアクセス許可を付与するには、代わりにグループの表示名を使用します (たとえば、myAzureSQLDBAccessGroup)。

  3. EXIT」と入力して Cloud Shell プロンプトに戻ります。

    Note

    マネージド ID のバックエンド サービスは、トークン キャッシュも管理します。トークン キャッシュでは、有効期限が切れたときにのみターゲット リソースのトークンが更新されます。 SQL Database のアクセス許可に設定ミスがあり、アプリでトークンを取得しようとした "後に" アクセス許可に変更を加えようとしても、実際には、キャッシュされたトークンの有効期限が切れるまで、更新されたアクセス許可で新しいトークンを取得することはできません。

    Note

    Microsoft Entra ID とマネージド ID は、オンプレミスの SQL Server ではサポートされていません。

接続文字列を変更する

Web.config または appsettings.json 内で行ったのと同じ変更をマネージド ID に対して使用できるため、必要な作業は App Service 内の既存の接続文字列 (ご自分のアプリを初めてデプロイすると Visual Studio によって作成されます) を削除することだけである点に注意してください。 次のコマンドを使用しますが、<app-name> をご自分のアプリの名前に置き換えます。

az webapp config connection-string delete --resource-group myResourceGroup --name <app-name> --setting-names MyDbConnection

5. 変更を発行する

あとは、Azure に変更を発行するだけです。

  1. チュートリアル: SQL Database を使用して Azure に ASP.NET アプリを作成する」からこのチュートリアルに進んできた場合は、Visual Studio での変更を発行します。 ソリューション エクスプローラーDotNetAppSqlDb プロジェクトを右クリックし、 [発行] を選択します。

    ソリューション エクスプローラーから発行する

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

    重要

    App Service 名が既存のアプリの登録と一致していないことを確認してください。 これにより、プリンシパル ID の競合が発生します。

新しい Web ページに To-Do リストを表示するとき、アプリはマネージド ID を使用してデータベースに接続しています。

Code First Migration の手順後の Azure アプリ

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

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

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

az group delete --name myResourceGroup

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

次のステップ

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

  • マネージド ID を有効にする
  • SQL Database へのアクセスをマネージド ID に付与する
  • SQL Database で Microsoft Entra 認証を使用するように Entity Framework を構成する
  • Microsoft Entra 認証を使用して Visual Studio から SQL Database に接続する