Adicione autenticação ao aplicativo Xamarin.Android
Neste tutorial, você adiciona autenticação da Microsoft ao projeto TodoApp usando o Microsoft Entra ID. Antes de concluir este tutorial, verifique se você criou o projeto e implantou o back-end.
Dica
Embora usemos a ID do Microsoft Entra para autenticação, você pode usar qualquer biblioteca de autenticação que desejar com os Aplicativos Móveis do Azure.
Adicionar autenticação ao seu serviço de back-end
Seu serviço de back-end é um serviço padrão ASP.NET 6. Qualquer tutorial que mostre como habilitar a autenticação para um serviço ASP.NET 6 funciona com os Aplicativos Móveis do Azure.
Para habilitar a autenticação do Microsoft Entra para seu serviço de back-end, você precisa:
- Registre um aplicativo com o Microsoft Entra ID.
- Adicione a verificação de autenticação ao projeto de back-end do ASP.NET 6.
Registrar o aplicativo
Primeiro, registre a API Web no seu locatário do Microsoft Entra e adicione um escopo seguindo estas etapas:
Entre no portal do Azure.
Se você tiver acesso a vários locatários, use o filtro Diretórios + assinaturas no menu superior para alternar para o locatário no qual deseja registrar o aplicativo.
Pesquise e selecione Microsoft Entra ID.
Em Gerenciar, selecione Registros de aplicativo>Novo registro.
- Nome: insira um nome para seu aplicativo, por exemplo, Guia de início rápido do TodoApp. Os usuários do seu aplicativo verão esse nome. Você pode alterar isso mais tarde.
- Tipos de conta suportados: Contas em qualquer diretório organizacional (Qualquer diretório do Microsoft Entra - Multilocatário) e contas pessoais da Microsoft (por exemplo, Skype, Xbox)
Selecione Registrar.
Em Gerenciar, selecione Expor uma API>Adicionar um escopo.
Para URI de ID do Aplicativo, aceite o padrão selecionando Salvar e continuar.
Insira os seguintes detalhes:
- Nome do escopo:
access_as_user
- Quem pode consentir? : Administradores e usuários
- Nome de exibição de consentimento do administrador:
Access TodoApp
- Descrição do consentimento do administrador:
Allows the app to access TodoApp as the signed-in user.
- Nome de exibição do consentimento do usuário:
Access TodoApp
- Descrição do consentimento do usuário:
Allow the app to access TodoApp on your behalf.
- Estado: Enabled
- Nome do escopo:
Selecione Adicionar escopo para concluir a adição do escopo.
Observe o valor do escopo, semelhante a
api://<client-id>/access_as_user
(conhecido como Escopo da API da Web). Você precisa do escopo ao configurar o cliente.Selecione Visão geral.
Anote a ID do Aplicativo (cliente) na seção Essentials (conhecida como ID do Aplicativo de API Web). Você precisa desse valor para configurar o serviço de back-end.
Abra o Visual Studio e selecione o TodoAppService.NET6
projeto.
Clique com o botão direito do
TodoAppService.NET6
mouse no projeto e selecione Gerenciar pacotes NuGet....Na nova guia, selecione Procurar e digite Microsoft.Identity.Web na caixa de pesquisa.
Selecione o
Microsoft.Identity.Web
pacote e pressione Instalar.Siga as instruções para concluir a instalação do pacote.
Abra
Program.cs
. Adicione o seguinte à lista deusing
instruções:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
- Adicione o seguinte código diretamente acima da chamada para
builder.Services.AddDbContext()
:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration);
builder.Services.AddAuthorization();
- Adicione o seguinte código diretamente acima da chamada para
app.MapControllers()
:
app.UseAuthentication();
app.UseAuthorization();
Seu Program.cs
deve se parecer com este:
using Microsoft.AspNetCore.Datasync;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
using TodoAppService.NET6.Db;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
if (connectionString == null)
{
throw new ApplicationException("DefaultConnection is not set");
}
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration);
builder.Services.AddAuthorization();
builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(connectionString));
builder.Services.AddDatasyncControllers();
var app = builder.Build();
// Initialize the database
using (var scope = app.Services.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
await context.InitializeDatabaseAsync().ConfigureAwait(false);
}
// Configure and run the web service.
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
- Edite o
Controllers\TodoItemController.cs
arquivo . Adicione um[Authorize]
atributo à classe. Sua classe deve ter a seguinte aparência:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Datasync;
using Microsoft.AspNetCore.Datasync.EFCore;
using Microsoft.AspNetCore.Mvc;
using TodoAppService.NET6.Db;
namespace TodoAppService.NET6.Controllers
{
[Authorize]
[Route("tables/todoitem")]
public class TodoItemController : TableController<TodoItem>
{
public TodoItemController(AppDbContext context)
: base(new EntityTableRepository<TodoItem>(context))
{
}
}
}
- Edite o
appsettings.json
arquivo . Adicione o seguinte bloco:
"AzureAd": {
"Instance": "https://login.microsoftonline.com",
"ClientId": "<client-id>",
"TenantId": "common"
},
Substitua o <client-id>
pelo ID do Aplicativo de API Web que você registrou anteriormente. Depois de concluído, ele deve ter a seguinte aparência:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com",
"ClientId": "<client-id>",
"TenantId": "common"
},
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=TodoApp;Trusted_Connection=True"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Publique seu serviço no Azure novamente:
- Clique com o botão direito do
TodoAppService.NET6
mouse no projeto e selecione Publicar.... - Selecione o botão Publicar no canto superior direito da guia.
Abra um navegador para https://yoursite.azurewebsites.net/tables/todoitem?ZUMO-API-VERSION=3.0.0
. Observe que o serviço agora retorna uma 401
resposta, que indica que a autenticação é necessária.
Registrar seu aplicativo com o serviço de identidade
O Microsoft Data Sync Framework tem suporte interno para qualquer provedor de autenticação que use um JWT (Json Web Token) em um cabeçalho da transação HTTP. Este aplicativo usa a Microsoft Authentication Library (MSAL) para solicitar esse token e autorizar o usuário conectado ao serviço de back-end.
Configurar um aplicativo de cliente nativo
Você pode registrar clientes nativos para permitir a autenticação nas APIs Web hospedadas no aplicativo usando uma biblioteca de clientes, como a biblioteca de identidade da Microsoft (MSAL).
No portal do Azure, selecione Registros do aplicativo ID>do> Microsoft Entra Novo registro.
Na página Registrar um aplicativo:
- insira um Nome para o registro do aplicativo. Você pode usar o nome
native-quickstart
para distinguir este do usado pelo seu serviço de back-end. - Selecione Contas em qualquer diretório organizacional (Qualquer diretório do Microsoft Entra - Multilocatário) e contas pessoais da Microsoft (por exemplo, Skype, Xbox).
- No URI de redirecionamento:
- Selecionar cliente público (móvel e desktop)
- Digite a URL
quickstart://auth
- insira um Nome para o registro do aplicativo. Você pode usar o nome
Selecione Registrar.
Selecione Permissões de API>Adicionar uma permissão>Minhas APIs.
Selecione o registro de aplicativo que você criou anteriormente para seu serviço de back-end. Se você não vir o registro do aplicativo, certifique-se de ter adicionado o escopo access_as_user.
Em Selecionar permissões, selecione access_as_user e, em seguida, selecione Adicionar permissões.
Selecione Autenticação>de aplicativos móveis e de desktop.
Marque a caixa ao lado de
https://login.microsoftonline.com/common/oauth2/nativeclient
.Marque a caixa ao lado de
msal{client-id}://auth
(substituindo{client-id}
pela ID do aplicativo).Selecione Adicionar URI e, em seguida, adicione
http://localhost
no campo para URIs extras.Escolha Salvar na parte inferior da página.
Selecione Visão geral. Anote a ID do Aplicativo (cliente) (conhecida como ID do Aplicativo Cliente Nativo) conforme necessário para configurar o aplicativo móvel.
Definimos três URLs de redirecionamento:
http://localhost
é usado por aplicativos WPF.https://login.microsoftonline.com/common/oauth2/nativeclient
é usado por aplicativos UWP.msal{client-id}://auth
é usado por aplicativos móveis (Android e iOS).
Adicionar o Microsoft Identity Client ao seu aplicativo
Abra a TodoApp.sln
solução no Visual Studio e defina o projeto como o TodoApp.Android
projeto de inicialização. Adicione a Microsoft Identity Library (MSAL) ao TodoApp.Android
projeto:
Adicione a Microsoft Identity Library (MSAL) ao projeto de plataforma:
Clique com o botão direito do mouse no projeto e selecione Gerenciar Pacotes NuGet....
Selecione a guia Procurar.
Insira
Microsoft.Identity.Client
na caixa de pesquisa e pressione Enter.Selecione o resultado
Microsoft.Identity.Client
e clique em Instalar.Aceite o contrato de licença e continue a instalação.
Adicione o ID do cliente nativo e o escopo de back-end à configuração.
Abra o projeto e edite o TodoApp.Data
Constants.cs
arquivo. Adicione constantes para ApplicationId
e Scopes
:
public static class Constants
{
/// <summary>
/// The base URI for the Datasync service.
/// </summary>
public static string ServiceUri = "https://demo-datasync-quickstart.azurewebsites.net";
/// <summary>
/// The application (client) ID for the native app within Microsoft Entra ID
/// </summary>
public static string ApplicationId = "<client-id>";
/// <summary>
/// The list of scopes to request
/// </summary>
public static string[] Scopes = new[]
{
"<scope>"
};
}
Substitua o pelo ID do Aplicativo Cliente Nativo que você recebeu ao registrar o aplicativo cliente no Microsoft Entra ID e pelo <scope>
Escopo da API Web que você copiou quando usou Expor uma API ao registrar o <client-id>
aplicativo de serviço.
Abra o MainActivity.cs
TodoApp.Android
arquivo no projeto. Na parte superior do arquivo, adicione as seguintes instruções using :
using Android.Content;
using Microsoft.Identity.Client;
using Microsoft.Datasync.Client;
using System.Linq;
using System.Threading.Tasks;
using Debug = System.Diagnostics.Debug;
Na parte superior da MainActivity
classe, adicione o seguinte campo:
public IPublicClientApplication identityClient;
OnCreate()
No método, altere a definição do TodoService
:
TodoService = new RemoteTodoService(GetAuthenticationToken);
Adicione o seguinte código para definir o GetAuthenticationToken()
método:
public async Task<AuthenticationToken> GetAuthenticationToken()
{
if (identityClient == null)
{
identityClient = PublicClientApplicationBuilder.Create(Constants.ApplicationId)
.WithAuthority(AzureCloudInstance.AzurePublic, "common")
.WithRedirectUri($"msal{Constants.ApplicationId}://auth")
.WithParentActivityOrWindow(() => this)
.Build();
}
var accounts = await identityClient.GetAccountsAsync();
AuthenticationResult result = null;
bool tryInteractiveLogin = false;
try
{
result = await identityClient
.AcquireTokenSilent(Constants.Scopes, accounts.FirstOrDefault())
.ExecuteAsync();
}
catch (MsalUiRequiredException)
{
tryInteractiveLogin = true;
}
catch (Exception ex)
{
Debug.WriteLine($"MSAL Silent Error: {ex.Message}");
}
if (tryInteractiveLogin)
{
try
{
result = await identityClient
.AcquireTokenInteractive(Constants.Scopes)
.ExecuteAsync()
.ConfigureAwait(false);
}
catch (Exception ex)
{
Debug.WriteLine($"MSAL Interactive Error: {ex.Message}");
}
}
return new AuthenticationToken
{
DisplayName = result?.Account?.Username ?? "",
ExpiresOn = result?.ExpiresOn ?? DateTimeOffset.MinValue,
Token = result?.AccessToken ?? "",
UserId = result?.Account?.Username ?? ""
};
}
O GetAuthenticationToken()
método funciona com o Microsoft Identity Library (MSAL) para obter um token de acesso adequado para autorizar o usuário conectado ao serviço de back-end. Essa função é então passada para o para criar o RemoteTodoService
cliente. Se a autenticação for bem-sucedida, o é produzido com os AuthenticationToken
dados necessários para autorizar cada solicitação. Caso contrário, um token incorreto expirado é produzido.
Manipule o retorno de chamada do cliente de identidade adicionando o seguinte método:
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
// Return control to MSAL
AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
}
Crie uma nova classe MsalActivity
com o seguinte código:
using Android.App;
using Android.Content;
using Microsoft.Identity.Client;
namespace TodoApp.Android
{
[Activity(Exported = true)]
[IntentFilter(new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
DataHost = "auth",
DataScheme = "msal{client-id}")]
public class MsalActivity : BrowserTabActivity
{
}
}
Substitua {client-id}
pela ID do aplicativo do cliente nativo (que é a mesma Constants.ApplicationId
que ).
Se o seu projeto tem como alvo o Android versão 11 (API versão 30) ou posterior, você deve atualizá-lo AndroidManifest.xml
para atender aos requisitos de visibilidade do pacote Android. Abra Properties/AndroidManifest.xml
e adicione os seguintes queries/intent
nós ao manifest
nó:
<manifest>
...
<queries>
<intent>
<action android:name="android.support.customtabs.action.CustomTabsService" />
</intent>
</queries>
</manifest>
Testar o aplicativo
Execute ou reinicie o aplicativo.
Quando o aplicativo é executado, um navegador é aberto para solicitar autenticação. Se você não tiver se autenticado com o aplicativo antes, o aplicativo pedirá que você concorde. Quando a autenticação estiver concluída, o navegador do sistema será fechado e seu aplicativo será executado como antes.
Próximas etapas
Em seguida, configure seu aplicativo para operar offline implementando um repositório offline.
Leitura adicional
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de