Compartilhar via


Autenticador da Web

Navegar na amostra. Navegar na amostra

Este artigo descreve como você pode usar a interface do usuário de aplicativo multiplataforma do .NET (.NET MAUI IWebAuthenticator). Essa interface permite iniciar fluxos de autenticação baseados em navegador, que escutam um retorno de chamada para uma URL específica registrada no aplicativo.

A implementação padrão da interface IWebAuthenticator está disponível por meio da propriedade WebAuthenticator.Default. A interface IWebAuthenticator e a classe WebAuthenticator estão contidas no namespace Microsoft.Maui.Authentication.

Visão geral

Muitos aplicativos exigem a adição da autenticação do usuário, e isso geralmente significa permitir que seus usuários entrem em sua conta existente da Microsoft, Facebook, Google ou Apple Sign In.

Dica

A MSAL (Biblioteca de Autenticação da Microsoft) fornece uma excelente solução turn-key para adicionar autenticação ao seu aplicativo.

Se você estiver interessado em usar seu próprio serviço Web para autenticação, é possível usar WebAuthenticator para implementar a funcionalidade do lado do cliente.

Por que usar um back-end do servidor

Muitos provedores de autenticação passaram a oferecer apenas fluxos de autenticação explícitos ou com dois fatores para garantir uma segurança melhor. Isso significa que você precisará de um segredo do cliente do provedor para concluir o fluxo de autenticação. Infelizmente, os aplicativos móveis não são um ótimo lugar para armazenar segredos e qualquer coisa armazenada no código, binários ou não de um aplicativo móvel é considerada insegura.

A prática recomendada aqui é usar um back-end da Web como uma camada intermediária entre seu aplicativo móvel e o provedor de autenticação.

Importante

É altamente recomendável não usar bibliotecas e padrões de autenticação somente móveis mais antigos que não aproveitam um back-end da Web no fluxo de autenticação devido à sua falta inerente de segurança para armazenar segredos do cliente.

Comece agora

Para acessar a WebAuthenticator funcionalidade, a configuração específica da plataforma a seguir é necessária.

O Android requer que um Filtro de Intenção seja configurado para lidar com o URI de retorno de chamada. Isso é feito herdando da WebAuthenticatorCallbackActivity classe:

using Android.App;
using Android.Content.PM;

namespace YourNameSpace;

[Activity(NoHistory = true, LaunchMode = LaunchMode.SingleTop, Exported = true)]
[IntentFilter(new[] { Android.Content.Intent.ActionView },
              Categories = new[] { Android.Content.Intent.CategoryDefault, Android.Content.Intent.CategoryBrowsable },
              DataScheme = CALLBACK_SCHEME)]
public class WebAuthenticationCallbackActivity : Microsoft.Maui.Authentication.WebAuthenticatorCallbackActivity
{
    const string CALLBACK_SCHEME = "myapp";

}

Se a versão de destino do Android do seu projeto estiver definida como Android 11 (R API 30) ou superior, você deverá atualizar o Android Manifest do seu projeto com consultas que atendam aos requisitos de visibilidade de pacotes do Android.

No arquivo Platforms/Android/AndroidManifest.xml, adicione os seguintes nós queries/intent no nó manifest:

<queries>
  <intent>
    <action android:name="android.support.customtabs.action.CustomTabsService" />
  </intent>
</queries>

Usando o WebAuthenticator

A API consiste principalmente em um único método, AuthenticateAsyncque usa dois parâmetros:

  1. A URL usada para iniciar o fluxo do navegador da Web.
  2. O URI para o qual o fluxo deve ser chamado, que está registrado no aplicativo.

Observação

Há também uma sobrecarga do AuthenticateAsync método que permite que um fluxo de autenticação seja cancelado programaticamente com um CancellationToken argumento.

O resultado é um 'WebAuthenticatorResult, que inclui todos os parâmetros de consulta analisados do URI de retorno de chamada:

try
{
    WebAuthenticatorResult authResult = await WebAuthenticator.Default.AuthenticateAsync(
        new Uri("https://mysite.com/mobileauth/Microsoft"),
        new Uri("myapp://"));

    string accessToken = authResult?.AccessToken;

    // Do something with the token
}
catch (TaskCanceledException e)
{
    // Use stopped auth
}

A WebAuthenticator API cuida de iniciar a URL no navegador e aguardar até que o retorno de chamada seja recebido:

Fluxo típico de autenticação da Web.

Se o usuário cancelar o fluxo em qualquer ponto, um TaskCanceledException será gerado.

Sessão de autenticação privada

O iOS 13 introduziu uma API de navegador da Web efêmera para desenvolvedores iniciarem a sessão de autenticação como privada. Isso permite que os desenvolvedores solicitem que nenhum cookie compartilhado ou dado de navegação esteja disponível entre as sessões de autenticação, garantindo uma nova sessão de logon a cada vez. Isso está disponível por meio do WebAuthenticatorOptions parâmetro passado para o AuthenticateAsync método:

try
{
    WebAuthenticatorResult authResult = await WebAuthenticator.Default.AuthenticateAsync(
        new WebAuthenticatorOptions()
        {
            Url = new Uri("https://mysite.com/mobileauth/Microsoft"),
            CallbackUrl = new Uri("myapp://"),
            PrefersEphemeralWebBrowserSession = true
        });

    string accessToken = authResult?.AccessToken;

    // Do something with the token
}
catch (TaskCanceledException e)
{
    // Use stopped auth
}

Diferenças de plataforma

Esta seção descreve as diferenças específicas da plataforma com a API de autenticação da Web.

As guias personalizadas são usadas sempre que disponíveis, caso contrário, o navegador do sistema é usado como um fallback.

Iniciar Sessão com Apple

De acordo com as diretrizes de revisão da Apple, se seu aplicativo Apple usar qualquer serviço de logon social para autenticar, ele também deverá oferecer a Entrada da Apple como uma opção. Para adicionar o Apple Sign In aos seus aplicativos, você precisará adicionar a permissão de login da Apple ao seu aplicativo. Esse direito é definido usando a com.apple.developer.applesignin chave, do tipo Array :String

<key>com.apple.developer.applesignin</key>
<array>
  <string>Default</string>
</array>

Para obter mais informações, consulte Entrar com o Entitlement Apple no developer.apple.com.

Para iOS 13 e superior, chame o método AppleSignInAuthenticator.AuthenticateAsync. Isso usa as APIs nativas de Entrada da Apple para que os usuários obtenham a melhor experiência possível nesses dispositivos. Por exemplo, você pode escrever seu código compartilhado para usar a API correta em runtime:

var scheme = "..."; // Apple, Microsoft, Google, Facebook, etc.
var authUrlRoot = "https://mysite.com/mobileauth/";
WebAuthenticatorResult result = null;

if (scheme.Equals("Apple")
    && DeviceInfo.Platform == DevicePlatform.iOS
    && DeviceInfo.Version.Major >= 13)
{
    // Use Native Apple Sign In API's
    result = await AppleSignInAuthenticator.AuthenticateAsync();
}
else
{
    // Web Authentication flow
    var authUrl = new Uri($"{authUrlRoot}{scheme}");
    var callbackUrl = new Uri("myapp://");

    result = await WebAuthenticator.Default.AuthenticateAsync(authUrl, callbackUrl);
}

var authToken = string.Empty;

if (result.Properties.TryGetValue("name", out string name) && !string.IsNullOrEmpty(name))
    authToken += $"Name: {name}{Environment.NewLine}";

if (result.Properties.TryGetValue("email", out string email) && !string.IsNullOrEmpty(email))
    authToken += $"Email: {email}{Environment.NewLine}";

// Note that Apple Sign In has an IdToken and not an AccessToken
authToken += result?.AccessToken ?? result?.IdToken;

Dica

Para dispositivos que não são iOS 13, isso iniciará o fluxo de autenticação da Web, que também pode ser usado para habilitar a Entrada da Apple em seus dispositivos Android e Windows. Você pode entrar em sua conta do iCloud no simulador do iOS para testar o Apple Sign In.

ASP.NET back-end do servidor principal

É possível usar a WebAuthenticator API com qualquer serviço de back-end da Web. Para usá-lo com um aplicativo ASP.NET principal, configure o aplicativo Web com as seguintes etapas:

  1. Configure seus provedores de autenticação social externos em um aplicativo Web ASP.NET Core.
  2. Defina o Esquema de Autenticação Padrão como CookieAuthenticationDefaults.AuthenticationScheme em sua .AddAuthentication() chamada.
  3. Use .AddCookie() em sua chamada Startup.cs.AddAuthentication() .
  4. Todos os provedores devem ser configurados com .SaveTokens = true;.
services.AddAuthentication(o =>
    {
        o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    })
    .AddCookie()
    .AddFacebook(fb =>
    {
        fb.AppId = Configuration["FacebookAppId"];
        fb.AppSecret = Configuration["FacebookAppSecret"];
        fb.SaveTokens = true;
    });

Dica

Se você quiser incluir o Login da Apple, poderá usar o pacote NuGet AspNet.Security.OAuth.Apple. Você pode exibir o exemplo de Startup.cs completo.

Adicionar um controlador de autenticação móvel personalizado

Com um fluxo de autenticação móvel, você geralmente inicia o fluxo diretamente para um provedor escolhido pelo usuário. Por exemplo, clicar em um botão "Microsoft" na tela de entrada do aplicativo. Também é importante retornar informações relevantes para o seu aplicativo em um URI específico para retorno a fim de encerrar o fluxo de autenticação.

Para fazer isso, use um controlador de API personalizado:

[Route("mobileauth")]
[ApiController]
public class AuthController : ControllerBase
{
    const string callbackScheme = "myapp";

    [HttpGet("{scheme}")] // eg: Microsoft, Facebook, Apple, etc
    public async Task Get([FromRoute]string scheme)
    {
        // 1. Initiate authentication flow with the scheme (provider)
        // 2. When the provider calls back to this URL
        //    a. Parse out the result
        //    b. Build the app callback URL
        //    c. Redirect back to the app
    }
}

A finalidade desse controlador é inferir o esquema (provedor) que o aplicativo está solicitando e iniciar o fluxo de autenticação com o provedor social. Quando o provedor faz uma chamada de retorno para o backend web, o controlador interpreta o resultado e redireciona para o URI de retorno de chamada do aplicativo com parâmetros.

Às vezes, você pode querer retornar dados, como os do access_token, ao aplicativo, algo que pode ser feito por meio dos parâmetros de consulta do URI de retorno de chamada. Ou talvez você queira, em vez disso, criar sua própria identidade em seu servidor e passar seu próprio token para o aplicativo. O que e como você faz essa parte cabe a você!

Confira o exemplo completo do controlador.

Observação

O exemplo acima demonstra como retornar o token de acesso do provedor de autenticação de terceiros (ou seja: OAuth). Para obter um token que você pode usar para autorizar solicitações da Web para o próprio back-end da Web, você deve criar seu próprio token em seu aplicativo Web e retornar isso. A visão geral da autenticação do ASP.NET Core tem mais informações sobre cenários avançados de autenticação no ASP.NET Core.