Korzystanie z funkcji sieci specyficznych dla platformy
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.
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/";