Verwenden von plattformspezifischen Netzwerkfunktionen

Abgeschlossen

Die HttpClient-Klasse stellt eine Abstraktion der Verbindung mit dem Netzwerk bereit. Eine App, die diese Klasse verwendet, ist unabhängig vom nativen Plattformnetzwerkstapel. Die .NET MAUI-Vorlagen ordnen die HttpClient-Klasse Code zu, der den nativen Netzwerkstapel jeder Plattform verwendet. Auf diese Weise kann eine Anwendung plattformspezifische Netzwerkkonfigurations- und Optimierungsfeatures nutzen. Dies ist besonders wichtig, wenn Sie eine Clientanwendung so konfigurieren müssen, dass eine sichere Verbindung mit einem REST-Webdienst hergestellt wird.

In dieser Lerneinheit erfahren Sie, wie Sie eine HTTP Clientanwendung so konfigurieren, dass sie die von der zugrunde liegenden Plattform bereitgestellten Netzwerkschutzfunktionen nutzt.

Konfigurieren von App-Transportsicherheit unter iOS

App-Transportsicherheit (App Transport Security, ATS) ist eine iOS-Funktion, die erfordert, dass für jede Netzwerkkommunikation, die über den nativen HTTP-Netzwerkstapel erfolgt, TLS 1.2 oder höher verwendet wird. Moderne Verschlüsselungsalgorithmen legen keine Informationen offen, wenn einer der Langzeitschlüssel beschädigt wird.

Wenn Ihre App diese Regeln nicht beachtet, wird ihr der Netzwerkzugriff verweigert. Um dieses Problem zu beheben, haben Sie zwei Optionen: Sie können Ihren Endpunkt so ändern, dass er der Richtlinie für App-Transportsicherheit entspricht, oder Sie können App-Transportsicherheit deaktivieren.

Um die App-Transportsicherheit zu deaktivieren, fügen Sie einen neuen Schlüssel mit dem Namen NSAppTransportSecurity in die Datei Info.plist ein. Sie finden die Datei Info.plist im Ordner iOS im Ordner Plattformen im Projektmappen-Explorer für das Projekt. Dieser Schlüssel ist eigentlich ein Wörterbuch. Fügen Sie diesem Wörterbuch einen weiteren Schlüssel namens NSExceptionDomains hinzu. Dieser Schlüssel enthält ein untergeordnetes Element für jeden der Endpunkte, die Sie ansprechen möchten. Jeder Endpunkt kann über eine eigene Konfiguration verfügen, die angibt, welche Features zulässig oder unzulässig sind. Sie können diesen Schlüssel entweder mithilfe des generischen plist-Editors in Visual Studio oder durch Öffnen als XML-Datei hinzufügen.

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.

Hier sehen Sie eine Beispielkonfiguration für einen Endpunkt, der als XML angezeigt wird:

<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>

In diesem Beispiel wird dem Endpunkt unter dotnet.microsoft.com eine Ausnahme hinzugefügt. Wenn Sie einen Dienst lokal auf Ihrem Entwicklungsrechner debuggen, können Sie die App-Transportsicherheit für den lokalen Datenverkehr mit dem Schlüssel NSAllowsLocalNetworking wie folgt deaktivieren:

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

Wenn Sie nicht alle Ihre Endpunkte identifizieren können, deaktivieren Sie App-Transportsicherheit für alle nicht angegebenen Endpunkte, indem Sie den Schlüssel NSAllowsArbitraryLoads verwenden:

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

Es gibt weitere Optionen, die Sie hinzufügen können, um genauer anzugeben, wie die Deaktivierung erfolgen soll. Weitere Anleitungen dazu sind jedoch nicht Thema dieses Moduls.

Konfigurieren von Android-Netzwerksicherheit

Wie iOS verfügt Android über ein ähnliches Sicherheitsmodell für die Netzwerkkommunikation. Dieses Modell wurde mit Android 9 (API-Ebene 28) eingeführt. Der Klartextdatenverkehr (Nicht-HTTPS-Datenverkehr) ist standardmäßig deaktiviert, wenn Ihre Anwendung auf Android 9 (API-Ebene 28) oder höher abzielt. Diese Richtlinie kann sich auf Ihren Entwicklungszyklus auswirken, wenn Ihre Anwendung ein Image oder eine Datei auf einen Server herunterladen muss, der nicht für HTTPS konfiguriert wurde. Sie könnten Ihre Anwendung auch nur lokal debuggen und keine Entwicklungszertifikate installieren. Vielleicht haben Sie strenge geschäftliche Anforderungen, dass der gesamte Webverkehr auf allen Versionen von Android immer über HTTPS läuft. Die Funktion Netzwerksicherheitskonfiguration von Android ermöglicht es Ihnen, die Sicherheit des Netzwerkverkehrs in einer App zu optimieren.

Zulassen von Klartextdatenverkehr

Um Klartext-Datenverkehr zuzulassen, erstellen Sie eine neue XML-Datei im Ordner Resources/xml mit dem Namen network_security_config.xml (Sie müssen eventuell auch den Ordner xml erstellen). Den Ordner Ressourcen finden Sie unter dem Plattformordner Android im Projektmappen-Explorer. Fügen Sie in dieser Datei ein network-security-config-Element mit einem untergeordneten domain-config-Element hinzu. Die folgende Konfiguration ermöglicht Klartextdatenverkehr für eine bestimmte Domäne und für eine IP-Adresse:

<?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>

Sie können die Sicherheit Ihrer App erhöhen, indem Sie Klartext-Datenverkehr auch für alle Versionen von Android unabhängig vom Zielframework einschränken. Dazu legen Sie die cleartextTrafficPermitted-Eigenschaft des domain-config-Elements auf false fest. Diese Konfigurationseinstellung blockiert den gesamten Nicht-HTTPS-Datenverkehr.

Damit die App die Datei network_security_config.xml erkennt, konfigurieren Sie die networkSecurityConfig-Eigenschaft für den application-Knoten in der Datei AndroidManifest.xml, die sich im Ordner Properties (Eigenschaften) befindet:

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

Sie können zusätzliche Optionen angeben, wenn Sie genauer angeben möchten, wie Transportsicherheit deaktiviert werden soll.

Lokales Debuggen von Apps

Ein wichtiger Vorteil der Erstellung mobiler Anwendungen mit Visual Studio ist die Möglichkeit, mobile Anwendungen mit dem iOS-Simulator oder Android-Emulator auszuführen und zu debuggen. Diese Apps können ASP.NET Core-Webdienste nutzen, die lokal ausgeführt und über HTTP bereitgestellt werden.

Anwendungen, die im iOS-Simulator ausgeführt werden, können über Ihre Computer-IP-Adresse oder über den Localhost-Hostnamen eine Verbindung mit lokalen HTTP-Webdiensten herstellen. Die Anwendung muss deaktivieren, dass ATS ein Minimum von NSAllowsLocalNetworking angibt. Bei einem lokalen HTTP-Webdienst, der einen GET-Vorgang über den relativen URI /api/todoitems/ bereitstellt, kann eine im iOS-Simulator ausgeführte Anwendung den Vorgang durch Senden einer GET-Anforderung an http://localhost:<port>/api/todoitems/ nutzen.

Anwendungen, die im Android-Emulator ausgeführt werden, können über die Adresse 10.0.2.2 eine Verbindung mit lokalen HTTP-Webdiensten herstellen. Diese Adresse ist ein Alias für die Host-Loopbackschnittstelle (127.0.0.1 auf Ihrem Entwicklungscomputer). Außerdem muss für diese spezifische IP-Adresse eine Netzwerksicherheitskonfiguration eingerichtet werden. Bei einem lokalen HTTP-Webdienst, der einen GET Vorgang über den relativen URI /api/todoitems/ bereitstellt, kann eine im Android-Emulator ausgeführte Anwendung den Vorgang durch Senden einer GET-Anforderung an http://10.0.2.2:/api/todoitems/ nutzen.

Hinweis

ASP.NET Core-Webdienste, die zu Testzwecken auf dem lokalen Host ausgeführt werden, müssen HTTPS-Umleitungen durch Auskommentieren der app.UseHttpsRedirection();-Anweisung in der Datei Startup.cs deaktivieren.

Erkennen des Betriebssystems

Eine App kann mithilfe der DeviceInfo-Klasse ermitteln, auf welcher Plattform sie ausgeführt wird. Im folgenden Beispiel legt die Anwendung die BaseAddress-Variable auf einen anderen Wert fest. Dies hängt davon ab, ob sie unter Android ausgeführt wird:

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