EFCoreでSQL Serverに接続できない

最近、Azureの勉強がてら、WebAPIとDB(SQL Server)をAzureにデプロイしました。
ConnectionStringが空文字になっているエラー(ConnectionStringを修正)
026-10-03 00:38:41.020 +00:00 [Error] Microsoft.EntityFrameworkCore.Database.Connection: An error occurred using the connection to database '' on server ''.
2026-10-03 00:38:41.054 +00:00 [Error] Microsoft.EntityFrameworkCore.Update: An exception occurred in the database while saving changes for context type
認証用トークンを取得できなかったことを指摘されるエラー(App ServiceでIDを作成(managed Identity))
2026-10-03 00:53:24.768 +00:00 [Error] Microsoft.EntityFrameworkCore.Update: An exception occurred in the database while saving changes for context type 'SampleApp.API.Models.SampleContext'.Microsoft.Data.SqlClient.SqlException (0x80131904): DefaultAzureCredential failed to retrieve a token from the included credentials.
DBにユーザーがないため、更新時に失敗したエラー(SQL ServerにUserを生成・権限付与)
2026-10-03 01:04:18.408 +00:00 [Error] Microsoft.EntityFrameworkCore.Update: An exception occurred in the database while saving changes for context type 'SampleApp.API.Models.SampleContext'.Microsoft.Data.SqlClient.SqlException (0x80131904): Login failed for user '<token-identified principal>'.at Microsoft.Data.SqlClient.SqlInternalConnection.
DBに詳しくないことから、何も考えずにデプロイして動かしたところ、案の定エラーが発生。Codexを使いつつでエラーは抑制し、無事WebAPI – DB間の通信に成功したのですが、このあたりは整理しておく必要があると思いました。
SQL Serverの認証方法
そもそもですが、SQL Serverには、Windows 認証モードとmixedモード(Windows認証+SQL Server認証)の2つの認証方法があります。(Microsoft, Choose an authentication mode, 確認日:2026/10/4)
これら2つに加え、Azure SQLでは、Microsoft EntraID(旧Active Directory)を用いて認証方法があります。
- Windows 認証モード
- OSから発行されたトークンを用いる
- mixedモード(WIndows認証+SQL Server認証)
- SQL Server認証の場合は、ユーザー名とパスワードを設定し、もいいる。
- Microsoft Entra認証
- Microsoft Entraを用いた認証
- Azsureサービス間での接続で推奨(Microsoft, Secretless authentication for Azure resources)
私の場合は、ローカルで開発している際はWindows 認証だったのですが、それをデプロイ前に考慮できておらず、エラーが多発してしまった、という状態でした。そこで、軽く調査をしてみたところ、Microsoft Entra認証がお勧めとの記載が見つかりましたので、そちらを導入しました。
Microsoft Entra認証導入の手順
- Connection Stringを修正
- App ServiceでUserを作成(managed Identity)
- SQL ServerにUserを生成・権限付与
1. Connection Stringを修正
Entra認証を使用することを明記します。
Authentication=Active Directory DefaultConnection Stringをどこに書くかはいくつかあると思いますが、私の場合はひとまずApp Service内の環境変数に追加しました。
2. App ServiceでIDを作成(managed Identity)
App service上で、System assignedなIDを作成します。(Microsoft, Authenticate Azure-hosted .NET apps to Azure resources using a system-assigned managed identity, 確認日:2026/10/4)
SQL Serverに接続する際、こちらのIDを用いて認証が行われます。
3. SQL ServerにUserを生成・権限付与
ここまでで、アプリが認証用トークンを取得できる状態になると思うのですが、このUserにどこまでの権限を付与するのかを設定する必要があります。以下、読み取りと書き込み権限を付与するクエリです。Azure SQL Database上でクエリを叩きます。
CREATE USER [<app-service-name>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<app-service-name>];
ALTER ROLE db_datawriter ADD MEMBER [<app-service-name>];ここまでできれば、Azure resource間での通信ができるはずです!!!
まとめ

- AzureへDBとWeb APIをデプロイする中で、SQL Serverの認証やユーザー管理で躓いた
- SQL Serverの認証方法はいくつかあり、Azureのリソース間ではMicrosoft Entraがお勧め
- 以下を修正することで通信ができた
- Connection Stringを修正
- App ServiceでIDを作成
- SQL ServerでUserを設定
手を動かすのも楽しいですが、やっぱり自分の言葉で整理すると理解が深まりますね。
コメント