Usar recursos de rede específicos da plataforma

Concluído

A classe HttpClient fornece uma abstração da conexão com a rede. Um aplicativo que usa essa classe é independente da pilha de rede da plataforma nativa. Os modelos .NET MAUI mapeiam a classe HttpClient para código que utiliza a pilha de rede nativa de cada plataforma. Isso permite que um aplicativo aproveite os recursos de configuração e otimização de rede específicos da plataforma. Isso é especialmente importante quando você precisa configurar um aplicativo cliente para se conectar com segurança a um serviço Web REST.

Nesta unidade, você aprenderá como configurar um aplicativo cliente HTTP para usar os recursos de proteção de rede que a plataforma subjacente fornece.

Configurar a segurança do transporte de aplicativos no iOS

O App Transport Security (ATS) é um recurso do iOS que requer todas as comunicações de rede feitas por meio da pilha de rede HTTP nativa para usar o TLS 1.2 ou superior. Os algoritmos de encriptação modernos não divulgam informações se uma das chaves de longo prazo for comprometida.

Se a sua aplicação não cumprir estas regras, ser-lhe-á negado o acesso à rede. Para corrigir esse problema, você tem duas opções; você pode alterar seu ponto de extremidade para aderir à política de Segurança de Transporte de Aplicativo ou pode desativar o Segurança de Transporte de Aplicativo.

Para desativar o App Transport Security, adicione uma nova chave chamada NSAppTransportSecurity ao arquivo Info.plist. Você encontrará o arquivo Info.plist na pasta iOS na pasta Plataformas do projeto no Gerenciador de Soluções. Esta chave é, na verdade, um dicionário. Adicione outra chave chamada NSExceptionDomains a este dicionário. Essa chave contém um filho para cada um dos pontos de extremidade que você deseja segmentar. Cada ponto de extremidade pode ter sua própria configuração, especificando quais recursos permitir ou não permitir. Você pode adicionar essa chave usando o editor plist genérico no Visual Studio ou abrindo-o como um arquivo 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.

Aqui está um exemplo de configuração para um ponto de extremidade mostrado como 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>

Este exemplo adiciona uma exceção ao ponto de extremidade em dotnet.microsoft.com. Se você estiver depurando um serviço localmente em sua máquina de desenvolvimento, poderá desativar o App Transport Security para tráfego local com a NSAllowsLocalNetworking seguinte chave:

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

Se você não conseguir identificar todos os seus pontos de extremidade, desative a Segurança de Transporte de Aplicativo para todos os pontos de extremidade não especificados usando a NSAllowsArbitraryLoads chave:

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

Há outras opções que você pode adicionar para ser mais específico sobre como deseja desativar. Outras orientações estão fora do âmbito deste módulo.

Configurar a segurança da Rede Android

Assim como o iOS, o Android tem um modelo de segurança semelhante em relação à comunicação de rede. Este modelo foi introduzido com o Android 9 (API nível 28). O tráfego de texto não criptografado (não HTTPS) é desativado por padrão quando seu aplicativo tem como alvo o Android 9 (API Nível 28) ou superior. Essa política pode afetar seu ciclo de desenvolvimento se seu aplicativo precisar baixar uma imagem ou arquivo em um servidor que não tenha sido configurado para HTTPS. Além disso, você pode estar apenas tentando depurar seu aplicativo localmente e não deseja instalar certificados de desenvolvimento. Você pode ter fortes requisitos de negócios que todo o tráfego da web em todas as versões do Android é sempre HTTPS. O recurso Configuração de Segurança de Rede do Android permite ajustar a segurança do tráfego de rede em um aplicativo.

Permitir tráfego de texto não criptografado

Para permitir o tráfego de texto não criptografado, crie um novo arquivo XML na pasta Resources/xml chamada network_security_config.xml (você também pode precisar criar a pasta xml). A pasta Recursos está na pasta da plataforma Android no Gerenciador de Soluções. Dentro desse arquivo, adicione um elemento com um network-security-configdomain-config elemento filho. A configuração a seguir permite o tráfego de texto não criptografado para um domínio específico e para um endereço 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>

Você pode fortalecer a segurança do seu aplicativo restringindo o tráfego de texto não criptografado em todas as versões do Android, independentemente da estrutura de destino. Para fazer isso, defina a cleartextTrafficPermitteddomain-config propriedade do elemento como false. Esta definição de configuração bloqueia todo o tráfego não-HTTPS.

Para que o aplicativo reconheça o arquivo network_security_config.xml, configure a networkSecurityConfig propriedade para o applicationnó no AndroidManifest.xml localizado na pasta Properties:

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

Você pode especificar opções adicionais se precisar ser mais específico sobre como deseja desativar a segurança do transporte.

Depurar aplicativos localmente

Um benefício importante da criação de aplicativos móveis com o Visual Studio é a capacidade de executar e depurar aplicativos móveis usando o simulador iOS ou emulador Android. Esses aplicativos podem consumir ASP.NET serviços Web principais que estão sendo executados localmente e expostos por HTTP.

As aplicações em execução no simulador iOS podem ligar-se a serviços Web HTTP locais utilizando o endereço IP da sua máquina ou através do nome de anfitrião local . O aplicativo deve optar por não participar do ATS, especificando um mínimo de NSAllowsLocalNetworking. Por exemplo, dado um serviço Web HTTP local que expõe uma operação por meio do URI relativo /api/todoitems/, um aplicativo em execução no simulador do iOS pode consumir a operação enviando uma GETGET solicitação para http://localhost:<port>/api/todoitems/.

Os aplicativos executados no emulador Android podem se conectar a serviços Web HTTP locais por meio do endereço 10.0.2.2. Esse endereço é um alias para a interface de loopback do host (127.0.0.1 em sua máquina de desenvolvimento). Uma configuração de segurança de rede também deve ser configurada para esse endereço IP específico. Por exemplo, dado um serviço Web HTTP local que expõe uma operação por meio do URI relativo /api/todoitems/, um aplicativo em execução no emulador Android pode consumir a operação enviando uma GETGET solicitação para http://10.0.2.2:/api/todoitems/.

Nota

ASP.NET serviços Web principais em execução em teste no host local devem desabilitar redirecionamentos HTTPS comentando a instrução app.UseHttpsRedirection(); no arquivo Startup.cs .

Detetar o sistema operacional

Um aplicativo pode determinar em qual plataforma está sendo executado usando a DeviceInfo classe. No exemplo a seguir, o aplicativo define a variável BaseAddress para um valor diferente, dependendo se ela está sendo executada no 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/";