プラットフォーム固有のネットワーク機能を使用する

完了

HttpClient クラスは、ネットワークへの接続の抽象化を提供します。 このクラスを使用するアプリは、ネイティブ プラットフォーム ネットワーク スタックには依存しません。 .NET MAUI テンプレートを使用すると、HttpClient クラスを、各プラットフォームのネイティブ ネットワーク スタックを利用するコードにマップできます。 これにより、アプリケーションは、プラットフォーム固有のネットワーク構成および最適化機能を利用できます。 これは、REST Web サービスに安全に接続するようにクライアント アプリケーションを構成する必要がある場合に特に重要です。

このユニットでは、基になるプラットフォームによって提供されるネットワーク保護機能を使用するように HTTP クライアント アプリケーションを構成する方法を学習します。

iOS でアプリケーション トランスポート セキュリティを構成する

アプリケーション トランスポート セキュリティ (ATS) は、ネイティブな HTTP ネットワーク スタックを使用して実行されるすべてのネットワーク通信で TLS 1.2 以上を使用することが必要な iOS 機能です。 最新の暗号化アルゴリズムでは、ロングターム キーの 1 つが侵害されても情報が漏洩されません。

アプリがこれらの規則に従っていない場合は、ネットワーク アクセスが拒否されます。 この問題を解決するには、2 つのオプションがあります。アプリケーション トランスポート セキュリティのポリシーに従うようにエンドポイントを変更するか、またはアプリケーション トランスポート セキュリティからオプトアウトできます。

アプリ トランスポート セキュリティからオプトアウトするために、Info.plist ファイルに NSAppTransportSecurity という名前の新しいキーを追加します。 Info.plist ファイルは、ソリューション エクスプローラーのプロジェクトの Platforms フォルダー内の iOS フォルダー内にあります。 このキーは、実際には辞書です。 この辞書に NSExceptionDomains という名前の別のキーを追加します。 このキーには、対象とする各エンドポイントの子が含まれています。 各エンドポイントには、どの機能を許可または禁止するかを指定する独自の構成を設定できます。 このキーは、Visual Studio の汎用の plist エディターを使用するか、またはそれを XML ファイルとして開くことによって追加できます。

Screenshot of left context menu with the open menu item selected. On the right is the window Visual Studio, X M L (text) editor is highlighted.

XML として示されている 1 つのエンドポイントの構成の例を次に示します。

<key>NSAppTransportSecurity</key>
<dict>
   <key>NSExceptionDomains</key>
      <dict>
      <key>dotnet.microsoft.com</key>
      <dict>
        <key>NSExceptionMinimumTLSVersion</key>
        <string>TLSv1.0</string>
        <key>NSExceptionAllowsInsecureHTTPLoads</key>
        <true/>
      </dict>
   </dict>
</dict>

この例では、dotnet.microsoft.com にあるエンドポイントに例外を追加します。 開発マシンでローカルでサービスをデバッグしている場合は、以下のように NSAllowsLocalNetworking キーを使用してローカル トラフィックのアプリ トランスポート セキュリティからオプトアウトできます。

<key>NSAppTransportSecurity</key>    
<dict>
    <key>NSAllowsLocalNetworking</key>
    <true/>
</dict>

すべてのエンドポイントを識別できない場合は、NSAllowsArbitraryLoads キーを使用して、指定されていないすべてのエンドポイントのアプリケーション トランスポート セキュリティを無効にします。

<key>NSAppTransportSecurity</key>
<dict>
   <key>NSAllowsArbitraryLoads</key>
   <true/>
</dict>

オプトアウトする方法をより具体的にするために追加できる他のオプションがあります。これ以上のガイダンスは、このモジュールの範囲外です。

Android ネットワークのセキュリティを構成する

iOS と同じように、Android にもネットワーク通信に関する同様のセキュリティ モデルがあります。 このモデルは、Android 9 (API レベル 28) で導入されました。 アプリケーションが Android 9 (API レベル 28) 以上を対象としている場合、クリア テキスト (非 HTTPS) トラフィックは既定で無効になります。 アプリが HTTPS 用に構成されていないサーバー上の画像またはファイルをダウンロードする必要がある場合、このポリシーは開発サイクルに影響を与える可能性があります。 また、アプリケーションをローカルでデバッグしようとしているだけで、開発証明書はインストールしたくない場合があるかもしれません。 すべてのバージョンの Android 上のすべての Web トラフィックが常に HTTPS であるという厳しいビジネス要件が存在する場合があるかもしれません。 Android のネットワーク セキュリティ構成機能を使用すると、アプリのネットワーク トラフィック セキュリティを微調整できます。

クリア テキスト トラフィックを許可する

クリア テキスト トラフィックを許可するには、Resources/xml フォルダーに network_security_config.xml という名前の新しい XML ファイルを作成します (xml フォルダーの作成も必要な場合があります)。 Resources フォルダーは、ソリューション エクスプローラーの Android プラットフォーム フォルダー内にあります。 このファイル内に、domain-config 子要素を持つ network-security-config 要素を追加します。 次の構成では、特定のドメインと IP アドレスのクリア テキスト トラフィックを有効にします。

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">10.0.2.2</domain> <!-- Debug port -->
    <domain includeSubdomains="true">microsoft.com</domain>
  </domain-config>
</network-security-config>

ターゲット フレームワークには関係なく、すべてのバージョンの Android 上でクリア テキスト トラフィックを制限することで、アプリのセキュリティを強化できます。 これを行うには、domain-config 要素の cleartextTrafficPermitted プロパティを false に設定します。 この構成設定では、HTTPS 以外のすべてのトラフィックがブロックされます。

アプリで network_security_config.xml ファイルを認識するには、Properties フォルダーにある AndroidManifest.xmlapplication ノードの networkSecurityConfig プロパティを構成します。

<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config" ...></application>
</manifest>

トランスポート セキュリティからオプトアウトする方法をより具体的にする必要がある場合は、追加オプションを指定できます。

アプリをローカルでデバッグする

Visual Studio を使用してモバイル アプリケーションを構築する重要な利点は、iOS シミュレーターまたは Android エミュレーターを使用してモバイル アプリケーションを実行およびデバッグする機能です。 これらのアプリは、ローカルで実行されており、HTTP 経由で公開されている ASP.NET Core Web サービスを使用できます。

iOS シミュレーターで実行されているアプリケーションは、マシンの IP アドレスを使用して、または localhost のホスト名を使用してローカル HTTP Web サービスに接続できます。 アプリケーションは、少なくとも NSAllowsLocalNetworking を指定して ATS からオプトアウトする必要があります。 たとえば、/api/todoitems/ の相対 URI 経由で GET 操作を公開しているローカル HTTP Web サービスがある場合、iOS シミュレーターで実行されているアプリケーションでは、http://localhost:<port>/api/todoitems/GET 要求を送信することによってこの操作を実行できます。

Android エミュレーターで実行されているアプリケーションは、10.0.2.2 アドレス経由でローカル HTTP Web サービスに接続できます。 このアドレスは、ホスト ループバック インターフェイス (開発マシン上の 127.0.0.1) のエイリアスです。 この特定の IP アドレスに対しては、ネットワークセキュリティ構成も設定する必要があります。 たとえば、/api/todoitems/ の相対 URI 経由で GET 操作を公開しているローカル HTTP Web サービスがある場合、Android エミュレーターで実行されているアプリケーションは、http://10.0.2.2:/api/todoitems/GET 要求を送信することによってこの操作を使用できます。

注意

ローカル ホスト上でテストで実行されている ASP.NET Core Web サービスは、Startup.cs ファイル内のステートメント app.UseHttpsRedirection(); をコメント アウトして HTTPS リダイレクトを無効にする必要があります。

オペレーティング システムを検出する

アプリは、DeviceInfo クラスを使用して、どのプラットフォーム上で実行されているかを判定できます。 次の例では、アプリケーションは Android 上で実行されているかどうかに応じて BaseAddress 変数を異なる値に設定します。

public static string BaseAddress = DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2:5000" : "http://localhost:5000";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";