使用平台特定網路功能

已完成

HttpClient 類別將網路連線抽象化。 使用此類別的應用程式與原生平台網路堆疊無關。 .NET MAUI 範本會將 HttpClient 類別對應至使用每個平臺原生網路堆疊的程式碼。 這可讓應用程式利用平台特定網路設定和最佳化功能。 當您需要設定用戶端應用程式以安全地連線至 REST Web 服務時,這特別重要。

在此單元中,您將了解如何設定 HTTP 用戶端應用程式,以使用基礎平台所提供的網路保護功能。

在 iOS 上設定應用程式傳輸安全性

應用程式傳輸安全性 (ATS) 是一種 iOS 功能,需要透過原生 HTTP 網路堆疊完成每個網路通訊,以使用 TLS 1.2 或更新版本。 如果其中一個長期金鑰遭竊,新式加密演算法將不會洩漏資訊。

如果您的應用程式並未遵守這些規則,則系統會拒絕它存取網路。 若要修正此問題,您有兩個選項:您可以變更端點以遵守應用程式傳輸安全性原則,也可以退出應用程式傳輸安全性。

若要退出應用程式傳輸安全性,請將名為 NSAppTransportSecurity 的新索引鍵新增至 Info.plist 檔案。 您將會在方案總管中專案的 Platforms 資料夾的 iOS 資料夾中找到 Info.plist 檔案。 此索引鍵實際上是字典。 將另一個稱為 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 的一個端點的範例設定:

<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 資料夾下建立一個新的 XML 檔案,名稱為 network_security_config.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 檔案,請在位於 [內容] 資料夾的 AndroidManifest.xml 中設定 application 節點的 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 服務。 應用程式必須退出 ATS,並指定 NSAllowsLocalNetworking 最小值。 例如,提供一個透過 /api/todoitems/ 相對 URI 公開 GET 作業的本機 HTTP Web 服務,在 iOS 模擬器中執行的應用程式即可將 GET 要求傳送至http://localhost:<連接埠>/api/todoitems/來取用作業。

在 Android 模擬器中執行的應用程式可以透過 10.0.2.2 位址連線至本機 HTTP Web 服務。 此位址是主機回送介面 (在您的開發機器上為 127.0.0.1) 的別名。 您也必須為此特定 IP 位址設定網路安全性設定。 例如,提供一個透過 /api/todoitems/ 相對 URI 公開 GET 作業的本機 HTTP Web 服務,在 Android 模擬器中執行的應用程式即可將 GET 要求傳送至 http://10.0.2.2:/api/todoitems/,以取用作業。

注意

在本機主機執行測試的 ASP.NET Core Web 服務必須註銷 Startup.cs 檔案中的 app.UseHttpsRedirection(); 陳述式,以停用 HTTPS 重新導向。

偵測作業系統

應用程式可以使用 DeviceInfo 類別來判斷其所執行的平台。 在下列範例中,應用程式會將 BaseAddress 變數設定為不同的值 (視其是否在 Android 上執行而定):

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