ツナ缶雑記

ぐうたらSEのブログです。主にマイクロソフト系技術を中心に扱います。

マネージド ID を使って App Service から SQL Database にアクセスする 中編

f:id:masatsuna:20200720015610p:plain

はじめに

前回に引き続き、マネージド ID を用いて App Service に配置した Web Application から SQL Database にアクセスする方法を解説していきます。 今回は中編として、システム割り当てマネージド ID 、ユーザー割り当てマネージド ID を使ってデータベースアクセスを行うためのアプリケーションの実装について解説していきます。 なお今回は .NET Framework 4.7.2 を用いていきます。

内容
前編 マネージド ID とは一体何かを概念的に解説し、それが Azure Portal 上でそれらがどのように見えるのか、具体的に解説します。
中編(本記事) ASP.NET の Web アプリケーションで システム割り当てマネージド ID 、ユーザー割り当てマネージド ID を取り扱う方法について解説します。
後編 Azure 上にアプリケーションを配置して、 App Service 上の Web アプリケーションから SQL Database にアクセスするまでの手順を解説します。

データベースアクセスを伴う Web Application を作る

マネージド ID を用いたデータベースアクセスを伴うアプリケーションを作る前に、まずは普通のデータベースアクセスを行う Web アプリケーションを作ります。 ASP.NET MVC 5.2.7 と Entity Framework 6.4.4 を用いて、単純な CRUD 操作を行うアプリケーションを作っておきます。 サンプルアプリケーションは以下からダウンロードできます。

github.com

そのままの状態ですと、ローカルマシン上の IIS Express 上でアプリケーションを実行し、データベースもローカルマシン上の SQL Server Local DB にアクセスするようになっています。

f:id:masatsuna:20200717002039p:plain
サンプルアプリケーションの実行後

では、このアプリケーションを改造して、マネージド ID が利用可能なアプリケーションに仕立てていきましょう。

NuGet パッケージのインストール

まずはマネージド ID を使って認証が実行できるように、 Microsoft.Azure.Services.AppAuthentication という NuGet パッケージを Web アプリケーションプロジェクトに追加します。

www.nuget.org

マネージド ID を使えるようにする

ここから先はローカルマシンで開発を行うための構成と、 App Service に配置するための構成とを分けて管理していきます。 Web.config にはローカルマシン上で実行するための構成設定を行い、App Service 用の構成設定は Release の構成として作成します。 マネージド ID は App Service 上で実行するときだけ使いたいので、 Web.Release.config に以下のような設定を行います。

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <configSections xdt:Transform="InsertIfMissing">
    <section name="SqlAuthenticationProviders"
             type="System.Data.SqlClient.SqlAuthenticationProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
             xdt:Transform="InsertIfMissing"
             xdt:Locator="Match(name)"/>
  </configSections>
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>

  <SqlAuthenticationProviders xdt:Transform="InsertIfMissing">
    <providers>
      <add name="Active Directory Interactive"
           type="Microsoft.Azure.Services.AppAuthentication.SqlAppAuthenticationProvider, Microsoft.Azure.Services.AppAuthentication" />
    </providers>
  </SqlAuthenticationProviders>
</configuration>

ここでは configSections 要素に対して name 属性が SqlAuthenticationProviders となる section 要素を追加しているのと、 SqlAuthenticationProviders 要素が追加されるように実装しています。 これでマネージド ID が利用できるようになります。

まだ接続文字列の設定を変更していないため、この設定変更だけでは SQL Database にアクセスすることはできません。 このあたりの設定は、 Azure Portal 上から App Service の構成に対して行っていきます。 詳細は後編で解説します。

動作確認

設定した通りに Config 変換が実行されるかどうか、ローカルマシン上で動作確認を行います。 Config 変換を実行するためには、 Visual Studio 上で発行ビルドを実行するのが最も簡単です。

[ソリューションエクスプローラー] で Web アプリケーションプロジェクトを右クリックして [発行] を選択します。 まず発行先にローカルマシン上のフォルダを指定します。 そして [既存のファイルの削除] を true に、 [構成] に Release を設定します。

f:id:masatsuna:20200718183343p:plain
既存ファイルの削除設定と構成の設定

この状態で [発行] ボタンを押下すると、発行ビルドが実行されます。 正しく Config 変換が設定できていれば、発行先のディレクトリに配置される Web.config に、 SqlAuthenticationProviders の設定が追加されるはずです。 発行先のディレクトリには以下のような Web.config が出力されます。

<?xml version="1.0" encoding="utf-8"?>
<!--
  ASP.NET アプリケーションの構成方法の詳細については、
  https://go.microsoft.com/fwlink/?LinkId=301880 を参照してください
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- 以下の要素が追加される -->
    <section name="SqlAuthenticationProviders" type="System.Data.SqlClient.SqlAuthenticationProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>

  <!-- 中略 -->

  <!-- 以下の要素が追加される -->
  <SqlAuthenticationProviders>
    <providers>
      <add name="Active Directory Interactive" type="Microsoft.Azure.Services.AppAuthentication.SqlAppAuthenticationProvider, Microsoft.Azure.Services.AppAuthentication" />
    </providers>
  </SqlAuthenticationProviders>
</configuration>
<!--ProjectGuid: 18F198EB-A905-405B-A41D-DAC66F0B388E-->

App Service に配置する

ここまで作成と動作確認が完了したら、前編で作成した App Service にアプリケーションを発行しましょう。 今回は最もシンプルな方法として、 Visual Studio から直接デプロイしてしまいます。 先ほど解説したフォルダーへの発行手順と同様に、今度は App Service に対して発行するように設定していきます。

f:id:masatsuna:20200720001005p:plain
発行先の選択

f:id:masatsuna:20200720001041p:plain
発行先に App Service を選択

発行先の App Service は前編で作成してあるため、今回は作成済みのものを選択して [完了] を押下します。

f:id:masatsuna:20200720001304p:plain
発行先の App Service を選択

最後に、 [構成] が [Release] に設定されていることを確認し、 [発行] ボタンを押下します。

f:id:masatsuna:20200720001704p:plain
構成を Release に設定して発行

発行が成功すると、ブラウザーが立ち上がり、配置した URL に遷移します。 しかし、まだデータベースを作成していないため、実行時エラーとなるはずです。

まとめ

今回は中編として、データアクセスを行う Web アプリケーションが、マネージド ID を使って SQL Database にアクセスするための下準備となる設定を行いました。 また構築したアプリケーションを App Service に配置しました。

次回は、SQL Database にマネージド ID を利用してアクセスできるようユーザー登録を行います。 また App Service に対して設定を行い、アプリケーションが動作するように構成していきます。