ConnnectionStringをSQL Server認証からWindows認証に変更する方法

ASP.NET Core 3.0 + EF Core 3.0 + IIS + SQL Server 2017の環境でWebアプリケーションを作っているのですが、そこでDB接続に使用しているConnnectionStringのPasswordを暗号化、秘匿化する方法として以下の3つが考えられます。

① Secret ManagerやAzure Key Vaultを使う。
② 暗号化、複合化クラスを作成して、ConnnectionStringを暗号化する。
SQL Server認証からWindows認証に変更する。(そもそもConnectionStringにPasswordを書かない)

今回、対応方法として1番手っ取り早い③について検証しました。
ただし、ConnnectionStringをSQL Server認証(saによる認証)から、Windows認証に変更しただけだと、以下のエラーがでる場合があります。
このエラーは、Windows認証の中でもNTLM認証の場合、つまりKerberos認証のように「ダブルホップ」を使用せず、IISのアプリケーションプールに指定したアカウントでDB接続する場合に発生します。

stackoverflow.com

このエラーが出る場合、以下の対応によりエラーが解消され、Windows認証によるDB接続が可能となります。

IISのアプリケーションプールのIDを既定のビルトインアカウント「ApplicationPoolIdentity」から、ビルトインアカウント「NetworkService」へ変更する。
② SSMS>セキュリティ>ログインから「NT AUTHORITY\NETWORK SERVICE」を追加して、サーバーロール「sysadmin」か、データベースロール「db_owner」を付ける。


もしくは「NetworkService」でなく、任意の管理用ドメインユーザーでも良いです。
IISのアプリケーションプールのIDを既定のビルトインアカウント「ApplicationPoolIdentity」から、カスタムアカウント「管理用ドメインユーザー」へ変更する。
② SSMS>セキュリティ >ログインから「管理用ドメインユーザー」を追加して、サーバーロール「sysadmin」かデータベースロール「db_owner」を付ける。


f:id:katharsis1721:20200308195027p:plain

f:id:katharsis1721:20200308195525p:plain

これにより以下のようにWindows認証により、Passwordを書かずにConnnectionStringを記述できるようになります。

SQL Server認証

Data Source=172.31.42.229;Initial Catalog=DB名;User ID=sa;Password=saのパスワード;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False


Windows認証

Data Source=172.31.42.229;Initial Catalog=DB名;Integrated Security=True


参考サイト
idmlab.eidentity.jp