Korzystanie z funkcji sieci specyficznych dla platformy

Ukończone

Klasa HttpClient zapewnia abstrakcję połączenia z siecią. Aplikacja korzystająca z tej klasy jest niezależna od natywnego stosu sieci platformy. Szablony MAUI platformy .NET mapuje klasę HttpClient na kod, który korzysta z natywnego stosu sieciowego każdej platformy. Dzięki temu aplikacja może korzystać z funkcji konfiguracji i optymalizacji sieci specyficznej dla platformy. Jest to szczególnie ważne, gdy należy skonfigurować aplikację kliencką w celu bezpiecznego łączenia się z usługą internetową REST.

W tej lekcji dowiesz się, jak skonfigurować aplikację kliencą HTTP do korzystania z funkcji ochrony sieci zapewnianej przez podstawową platformę.

Konfigurowanie usługi App Transport Security w systemie iOS

App Transport Security (ATS) to funkcja systemu iOS, która wymaga każdej komunikacji sieciowej wykonywanej za pośrednictwem natywnego stosu sieciowego HTTP do używania protokołu TLS 1.2 lub nowszego. Nowoczesne algorytmy szyfrowania nie ujawnią informacji, jeśli jeden z długoterminowych kluczy zostanie naruszony.

Jeśli aplikacja nie jest zgodna z tymi regułami, nastąpi odmowa dostępu do sieci. Aby rozwiązać ten problem, masz dwie opcje: Możesz zmienić punkt końcowy, aby był zgodny z zasadami usługi App Transport Security lub zrezygnować z usługi App Transport Security.

Aby zrezygnować z usługi App Transport Security, dodaj nowy klucz o nazwie NSAppTransportSecurity do pliku Info.plist . Plik Info.plist znajduje się w folderze systemu iOS w folderze Platformy projektu w Eksplorator rozwiązań. Ten klucz jest w rzeczywistości słownikiem. Dodaj kolejny klucz o nazwie NSExceptionDomains do tego słownika. Ten klucz zawiera element podrzędny dla każdego z punktów końcowych, które mają być docelowe. Każdy punkt końcowy może mieć własną konfigurację, określając, które funkcje mają być dozwolone lub niedozwolone. Ten klucz można dodać przy użyciu ogólnego edytora plist w programie Visual Studio lub otwierając go jako plik 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.

Oto przykładowa konfiguracja dla jednego punktu końcowego pokazanego jako 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>

W tym przykładzie dodano wyjątek do punktu końcowego w dotnet.microsoft.com. Jeśli debugujesz usługę lokalnie na komputerze deweloperskim, możesz zrezygnować z usługi App Transport Security dla ruchu lokalnego przy użyciu NSAllowsLocalNetworking klucza w następujący sposób:

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

Jeśli nie możesz zidentyfikować wszystkich punktów końcowych, wyłącz usługę App Transport Security dla wszystkich nieokreślonych punktów końcowych przy użyciu NSAllowsArbitraryLoads klucza:

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

Istnieją inne opcje, które można dodać, aby bardziej szczegółowe informacje o tym, jak chcesz zrezygnować. Dalsze wskazówki wykraczają poza zakres tego modułu.

Konfigurowanie zabezpieczeń sieci systemu Android

Podobnie jak w systemie iOS, system Android ma podobny model zabezpieczeń wokół komunikacji sieciowej. Ten model został wprowadzony z systemem Android 9 (poziom interfejsu API 28). Ruch w postaci zwykłego tekstu (bez protokołu HTTPS) jest domyślnie wyłączony, gdy aplikacja jest przeznaczona dla systemu Android 9 (poziom 28 interfejsu API) lub nowszego. Te zasady mogą mieć wpływ na cykl programowania, jeśli aplikacja musi pobrać obraz lub plik na serwerze, który nie został skonfigurowany dla protokołu HTTPS. Ponadto możesz po prostu próbować debugować aplikację lokalnie i nie chcieć zainstalować certyfikatów programistycznych. Być może masz silne wymagania biznesowe, że cały ruch internetowy we wszystkich wersjach systemu Android jest zawsze HTTPS. Funkcja Konfiguracja zabezpieczeń sieci systemu Android umożliwia precyzyjne dostrojenie zabezpieczeń ruchu sieciowego w aplikacji.

Zezwalaj na ruch w postaci zwykłego tekstu

Aby zezwolić na ruch w postaci zwykłego tekstu, utwórz nowy plik XML w folderze Resources/xml o nazwie network_security_config.xml (może być również konieczne utworzenie folderu XML ). Folder Resources znajduje się w folderze platformy systemu Android w Eksplorator rozwiązań. Wewnątrz tego pliku dodaj network-security-config element z elementem podrzędnym domain-config . Poniższa konfiguracja umożliwia ruch w postaci zwykłego tekstu dla określonej domeny i dla adresu 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>

Zabezpieczenia aplikacji można zwiększyć, ograniczając ruch w postaci zwykłego tekstu we wszystkich wersjach systemu Android niezależnie od platformy docelowej. W tym celu należy ustawić cleartextTrafficPermitted właściwość domain-config elementu na false. To ustawienie konfiguracji blokuje cały ruch inny niż HTTPS.

Aby aplikacja rozpoznawała plik network_security_config.xml , skonfiguruj networkSecurityConfig właściwość dla application węzła w pliku AndroidManifest.xml znajdującym się w folderze Properties :

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

Jeśli chcesz zrezygnować z zabezpieczeń transportu, możesz określić dodatkowe opcje.

Lokalne debugowanie aplikacji

Ważną zaletą tworzenia aplikacji mobilnych za pomocą programu Visual Studio jest możliwość uruchamiania i debugowania aplikacji mobilnych przy użyciu symulatora systemu iOS lub emulatora systemu Android. Te aplikacje mogą korzystać z ASP.NET Podstawowych usług internetowych, które są uruchomione lokalnie i uwidocznione za pośrednictwem protokołu HTTP.

Aplikacje działające w symulatorze systemu iOS mogą łączyć się z lokalnymi usługami internetowymi HTTP przy użyciu adresu IP maszyny lub za pośrednictwem nazwy hosta localhost . Aplikacja musi zrezygnować z usługi ATS, określając minimalną wartość NSAllowsLocalNetworking. Na przykład, biorąc pod uwagę lokalną usługę internetową HTTP, która uwidacznia operację za pośrednictwem /api/todoitems/ względnego identyfikatora URI, aplikacja uruchomiona w symulatorze systemu iOS może korzystać z tej operacji, wysyłając GET żądanie do http://localhost:<portu>/interfejsu API/todoitems/.GET

Aplikacje działające w emulatorze systemu Android mogą łączyć się z lokalnymi usługami internetowymi HTTP za pośrednictwem adresu 10.0.2.2. Ten adres jest aliasem dla interfejsu sprzężenia zwrotnego hosta (127.0.0.1 na maszynie dewelopera). Należy również skonfigurować konfigurację zabezpieczeń sieci dla tego konkretnego adresu IP. Na przykład, biorąc pod uwagę lokalną usługę internetową HTTP, która uwidacznia operację GET za pośrednictwem /api/todoitems/ względnego identyfikatora URI, aplikacja uruchomiona w emulatorze systemu Android może korzystać z operacji, wysyłając GET żądanie do http://10.0.2.2:/api/todoitems/.

Uwaga

ASP.NET Podstawowe usługi internetowe uruchomione w ramach testu na hoście lokalnym muszą wyłączyć przekierowania HTTPS, komentując instrukcję app.UseHttpsRedirection(); w pliku Startup.cs .

Wykrywanie systemu operacyjnego

Aplikacja może określić, na której platformie jest uruchomiona, przy użyciu DeviceInfo klasy . W poniższym przykładzie aplikacja ustawia zmienną BaseAddress na inną wartość w zależności od tego, czy jest uruchomiona w systemie 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/";