使用平台特定網路功能

已完成

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 檔案形式開啟此索引鍵,來新增此索引鍵。

螢幕擷取畫面:已選取所開啟功能表項目的左側捷徑功能表。右側是視窗 Visual Studio,並醒目提示 X M L (文字) 編輯器。

以下是顯示為 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/";