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 o código que utiliza a pilha de rede nativa de cada plataforma. Isso permite que um aplicativo aproveite os recursos de otimização e configuraçã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á a configurar um aplicativo cliente HTTP para usar os recursos de proteção de rede fornecidos pela plataforma subjacente.

Configurar a Segurança do Transporte do Aplicativo no iOS

A ATS (Segurança do Transporte do Aplicativo) é um recurso do iOS que exige que toda comunicação de rede feita por meio da pilha de rede HTTP nativa use TLS 1.2 ou posterior. Os algoritmos de criptografia modernos não divulgarão informações se uma das chaves de longo prazo for comprometida.

Se o aplicativo não aderir a essas regras, o acesso à rede será recusado. Para consertar esse problema, você tem duas opções; você pode alterar seu ponto de extremidade para aderir à política de Segurança do Transporte do Aplicativo ou pode recusar a Segurança do Transporte do Aplicativo.

Para recusar a Segurança do Transporte do Aplicativo, 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. Essa chave é, na verdade, um dicionário. Adicione outra chave chamada NSExceptionDomains a esse dicionário. Essa chave contém um filho para cada um dos pontos de extremidade que você quer como destino. Cada ponto de extremidade pode ter a própria configuração, especificando quais recursos permitir ou não permitir. Você pode adicionar essa chave usando o editor de plist genérico no Visual Studio ou abrindo-a como um arquivo XML.

Captura de tela de um menu de contexto com o item de menu aberto selecionado. À direita está a janela do Visual Studio, o editor de XML (texto) está realçado.

Veja abaixo 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 no seu computador de desenvolvimento, poderá recusar a Segurança do Transporte de Aplicativo para tráfego local com a chave NSAllowsLocalNetworking da seguinte maneira:

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

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

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

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

Configurar a segurança de rede do Android

Assim como o iOS, o Android tem um modelo de segurança semelhante em relação à comunicação de rede. Esse modelo foi introduzido com Android 9 (nível da API 28). O tráfego de texto não criptografado (não HTTPS) é desabilitado por padrão quando seu aplicativo é direcionado para o Android 9 (nível da API 28) ou posterior. Essa política pode afetar seu ciclo de desenvolvimento se o aplicativo precisar baixar uma imagem ou arquivo em um servidor não configurado para HTTPS. Além disso, você pode estar apenas tentando depurar o aplicativo localmente e não querer instalar certificados de desenvolvimento. Você pode ter requisitos de negócios sólidos que determinam que todo o tráfego da Web em todas as versões do Android seja 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 chamado network_security_config.xml (talvez também seja necessário criar a pasta xml). A pasta Recursos está na pasta da plataforma Android no Gerenciador de Soluções. Dentro desse arquivo, adicione um elemento network-security-config com um elemento filho domain-config. A seguinte configuração 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 reforçar 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. Isso é feito definindo a propriedade cleartextTrafficPermitted do elemento domain-config como false. Essa 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 propriedade networkSecurityConfig do nó application 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 recusar 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 o Android Emulator. Esses aplicativos podem consumir serviços Web do ASP.NET Core que estão sendo executados localmente e expostos por HTTP.

Os aplicativos em execução no Simulador do iOS podem se conectar a serviços Web HTTP locais por meio do endereço IP de seus computadores ou pelo nome de host do localhost. O aplicativo precisa recusar o ATS especificando no mínimo NSAllowsLocalNetworking. Por exemplo, considerando um serviço Web HTTP local que expõe uma operação GET por meio do URI relativo /api/todoitems/, um aplicativo em execução no Simulador do iOS pode consumir a operação enviando uma solicitação GET para http://localhost:<port>/api/todoitems/.

Os aplicativos em execução no Android Emulator podem se conectar aos 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 no computador de desenvolvimento). Uma configuração de segurança de rede também deve ser definida para esse endereço IP específico. Por exemplo, considerando um serviço Web HTTP local que expõe uma operação GET por meio do URI relativo /api/todoitems/, um aplicativo em execução no Android Emulator pode consumir a operação enviando uma solicitação GET para http://10.0.2.2:/api/todoitems/.

Observação

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

Detectar o sistema operacional

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