Использование сетевых возможностей платформы

Завершено

Класс HttpClient предоставляет абстракцию подключения к сети. Приложение, использующее этот класс, не зависит от сетевого стека собственной платформы. Шаблоны .NET MAUI сопоставляют класс HttpClient с кодом, который использует собственный сетевой стек каждой платформы. Это позволяет приложению использовать возможности конфигурации и оптимизации сети для конкретной платформы. Это особенно важно, если необходимо настроить клиентское приложение для безопасного подключения к веб-службе REST.

В этом уроке вы узнаете, как настроить клиентское приложение HTTP для использования возможностей защиты сети, которые предоставляет базовая платформа.

Настройка защиты транспорта приложений на iOS

Защита транспорта приложения (ATS) — это функция iOS, которая требует, чтобы каждое сетевое взаимодействие, осуществляемое через собственный сетевой стек HTTP, использовало TLS 1.2 или более поздней версии. Современные алгоритмы шифрования не раскроют информацию, если скомпрометирован один из долгосрочных ключей.

Если приложение не соответствует этим правилам, ему будет запрещен доступ к сети. Чтобы устранить эту проблему, у вас есть два варианта: вы можете изменить конечную точку в соответствии с политикой защиты транспорта приложений или отказаться от использования защиты транспорта приложений.

Чтобы отказаться от защиты транспорта приложений, добавьте новый ключ, вызываемый NSAppTransportSecurity в файл Info.plist. Файл Info.plist находится в папке iOS в папке проекта "Платформы" в Обозреватель решений. Этот ключ фактически является словарем. Добавьте еще один ключ, называемый NSExceptionDomains, в этот словарь. Ключ содержит дочерний элемент для каждой конечной точки, которую вы хотите использовать. Каждая конечная точка может иметь собственную конфигурацию, которая указывает, какие функции следует разрешить или запретить. Этот ключ можно добавить с помощью универсального редактора plist в Visual Studio или открыв его в виде 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). Трафик в формате открытого текста (без HTTPS) по умолчанию запрещен, если приложение создается для Android 9 (уровень API 28) или более поздних версий. Эта политика может повлиять на цикл разработки, если приложению нужно скачать изображение или файл на сервере, который не был настроен для HTTPS. Кроме того, вы можете просто попытаться отлаживать приложение локально и не хотите устанавливать сертификаты разработки. Возможно, у вас есть строгие бизнес-требования, что весь веб-трафик на всех версиях Android всегда httpS. Функция конфигурации сетевой безопасности Android позволяет точно настроить безопасность сетевого трафика в приложении.

Разрешение трафика с открытым текстом

Чтобы разрешить чистый текстовый трафик, создайте xml-файл в папке Resources/xml с именем network_security_config.xml (возможно, вам также потребуется создать xml-папку). Папка Resources находится в папке платформы Android в Обозреватель решений. В этом файле добавьте элемент network-security-config с дочерним элементом domain-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 независимо от целевой платформы. Для этого присвойте cleartextTrafficPermitted свойству domain-config элемента значение false. Этот параметр конфигурации блокирует весь трафик, отличный от HTTPS.

Чтобы приложение распознавало файл network_security_config.xml, настройте свойство networkSecurityConfig для узла application в файле AndroidManifest.xml, расположенном в папке Properties:

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

Вы можете указать дополнительные параметры, если вам нужно подробно указать способ отказа от защиты транспорта.

Локальная отладка приложений

Важным преимуществом создания мобильных приложений с помощью Visual Studio является возможность запуска и отладки мобильных приложений с помощью симулятора iOS или эмулятора Android. Эти приложения могут использовать веб-службы ASP.NET Core, работающие локально и предоставляемые по протоколу HTTP.

Приложения, выполняющиеся в симуляторе iOS, могут подключаться к локальным веб-службам HTTP по IP-адресу компьютера или имени узла localhost. Приложение должно отказаться от ATS, указав минимум NSAllowsLocalNetworking. Например, учитывая локальную веб-службу HTTP, которая предоставляет GET операцию через URI /api/todoitems/ относительный URI, приложение, работающее в симуляторе iOS, может использовать операцию, отправив GET запрос в http://localhost:<порт>/api/todoitems/.

Приложения, работающие в эмуляторе Android, могут подключаться к локальным веб-службам HTTP по адресу 10.0.2.2. Этот адрес является псевдонимом для интерфейса замыкания на себя (127.0.0.1 на компьютере разработки). Для этого конкретного IP-адреса также необходимо настроить конфигурацию безопасности сети. Например, если локальная веб-служба HTTP предоставляет операцию GET по относительному URI /api/todoitems/, то работающее в эмуляторе Android приложение может использовать эту операцию, отправляя запросы GET на адрес http://10.0.2.2:/api/todoitems/.

Примечание.

Веб-службы ASP.NET Core, выполняющиеся в тестовом режиме на локальном узле, должны отключить перенаправления HTTPS. Для этого закомментируйте инструкцию app.UseHttpsRedirection(); в файле Startup.cs.

Определение операционной системы

Приложение может определить, на какой платформе оно выполняется, с помощью класса 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/";