Escolher um provedor de autenticação do Microsoft Graph com base no cenário
Os provedores de autenticação implementam o código necessário para adquirir um token usando a MSAL (Biblioteca de Autenticação da Microsoft); tratar vários erros potenciais para casos como consentimento incremental, senhas expiradas e acesso condicional; e, em seguida, defina o cabeçalho de autorização de solicitação HTTP. A tabela a seguir lista o conjunto de provedores que correspondem aos cenários de diferentes tipos de aplicativo.
| Cenário | Fluxo/Concessão | Espectadores | Provedor |
|---|---|---|---|
| Aplicativo de Página Única | Código de autorização com PKCE | Consumidor delegado/organização | Provedor de código de autorização |
| Aplicativo Web que chama APIs Web | |||
| Código de Autorização | Consumidor delegado/organização | Provedor de código de autorização | |
| Credenciais do cliente | Somente aplicativo | Provedor de credenciais do cliente | |
| API Web que chama APIs Web | |||
| Em nome de | Consumidor delegado/organização | Provedor em nome de | |
| Credenciais do cliente | Somente aplicativo | Provedor de credenciais do cliente | |
| Aplicativo da área de trabalho que chama APIs Web | |||
| Interativo | Consumidor delegado/organização | Provedor interativo | |
| Windows integrado | Organização Delegada | Provedor integrado do Windows | |
| Proprietário do Recurso | Organização Delegada | Provedor de nome de usuário/senha | |
| Código do dispositivo | Organização Delegada | Provedor de código do dispositivo | |
| Aplicativo Daemon | |||
| Credenciais do cliente | Somente aplicativo | Provedor de credenciais do cliente | |
| Aplicativo móvel que chama APIs Web | |||
| Interativo | Consumidor delegado/organização | Provedor interativo |
Observação
Os snippets de código a seguir foram escritos com as versões mais recentes de seus respectivos SDKs. Se você encontrar erros do compilador com esses snippets, verifique se você tem as versões mais recentes. Os provedores de autenticação usados são fornecidos pelas seguintes bibliotecas de Identidade do Azure:
- Os desenvolvedores do .NET precisam adicionar o pacote Azure.Identity .
- Os desenvolvedores de JavaScript precisam adicionar a biblioteca @azure/identidade .
- Os desenvolvedores de Java e Android precisam adicionar a biblioteca de identidade do azure .
Provedor de código de autorização
O fluxo de código de autorização permite que aplicativos Nativos e Web obtenham tokens com segurança no nome do usuário. Para saber mais, confira plataforma de identidade da Microsoft fluxo de código de autorização do OAuth 2.0.
var scopes = new[] { "User.Read" };
// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";
// Values from app registration
var clientId = "YOUR_CLIENT_ID";
var clientSecret = "YOUR_CLIENT_SECRET";
// For authorization code flow, the user signs into the Microsoft
// identity platform, and the browser is redirected back to your app
// with an authorization code in the query parameters
var authorizationCode = "AUTH_CODE_FROM_REDIRECT";
// using Azure.Identity;
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
// https://docs.microsoft.com/dotnet/api/azure.identity.authorizationcodecredential
var authCodeCredential = new AuthorizationCodeCredential(
tenantId, clientId, clientSecret, authorizationCode, options);
var graphClient = new GraphServiceClient(authCodeCredential, scopes);
Provedor de credenciais do cliente
O fluxo de credenciais do cliente permite que os aplicativos de serviço executem sem interação do usuário. O acesso é baseado na identidade do aplicativo. Para obter mais informações, plataforma de identidade da Microsoft fluxo de credenciais do cliente OAuth 2.0.
Usando um segredo do cliente
// The client credentials flow requires that you request the
// /.default scope, and preconfigure your permissions on the
// app registration in Azure. An administrator must grant consent
// to those permissions beforehand.
var scopes = new[] { "https://graph.microsoft.com/.default" };
// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";
// Values from app registration
var clientId = "YOUR_CLIENT_ID";
var clientSecret = "YOUR_CLIENT_SECRET";
// using Azure.Identity;
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
// https://docs.microsoft.com/dotnet/api/azure.identity.clientsecretcredential
var clientSecretCredential = new ClientSecretCredential(
tenantId, clientId, clientSecret, options);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
Usando um certificado de cliente
var scopes = new[] { "https://graph.microsoft.com/.default" };
// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";
// Values from app registration
var clientId = "YOUR_CLIENT_ID";
var clientCertificate = new X509Certificate2("MyCertificate.pfx");
// using Azure.Identity;
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
// https://docs.microsoft.com/dotnet/api/azure.identity.clientcertificatecredential
var clientCertCredential = new ClientCertificateCredential(
tenantId, clientId, clientCertificate, options);
var graphClient = new GraphServiceClient(clientCertCredential, scopes);
Provedor em nome de
O fluxo em nome de é aplicável quando seu aplicativo chama um serviço/API Web que, por sua vez, chama o Microsoft API do Graph. Saiba mais lendo plataforma de identidade da Microsoft e o fluxo On-Behalf-Of do OAuth 2.0
O Azure.Identity pacote não dá suporte ao fluxo em nome da versão 1.4.0. Em vez disso, crie um provedor de autenticação personalizado usando a MSAL.
var scopes = new[] { "User.Read" };
// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";
// Values from app registration
var clientId = "YOUR_CLIENT_ID";
var clientSecret = "YOUR_CLIENT_SECRET";
// using Azure.Identity;
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
// This is the incoming token to exchange using on-behalf-of flow
var oboToken = "JWT_TOKEN_TO_EXCHANGE";
var cca = ConfidentialClientApplicationBuilder
.Create(clientId)
.WithTenantId(tenantId)
.WithClientSecret(clientSecret)
.Build();
// DelegateAuthenticationProvider is a simple auth provider implementation
// that allows you to define an async function to retrieve a token
// Alternatively, you can create a class that implements IAuthenticationProvider
// for more complex scenarios
var authProvider = new DelegateAuthenticationProvider(async (request) => {
// Use Microsoft.Identity.Client to retrieve token
var assertion = new UserAssertion(oboToken);
var result = await cca.AcquireTokenOnBehalfOf(scopes, assertion).ExecuteAsync();
request.Headers.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", result.AccessToken);
});
var graphClient = new GraphServiceClient(authProvider);
Provedor implícito
O fluxo de Autenticação Implícita não é recomendado devido às suas desvantagens. Clientes públicos, como aplicativos nativos e aplicativos JavaScript, agora devem usar o fluxo de código de autorização com a extensão PKCE. Referência.
Provedor de código do dispositivo
O fluxo de código do dispositivo permite entrar em dispositivos por meio de outro dispositivo. Para obter detalhes, consulte plataforma de identidade da Microsoft fluxo de código do dispositivo OAuth 2.0.
var scopes = new[] { "User.Read" };
// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";
// Value from app registration
var clientId = "YOUR_CLIENT_ID";
// using Azure.Identity;
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
// Callback function that receives the user prompt
// Prompt contains the generated device code that use must
// enter during the auth process in the browser
Func<DeviceCodeInfo, CancellationToken, Task> callback = (code, cancellation) => {
Console.WriteLine(code.Message);
return Task.FromResult(0);
};
// https://docs.microsoft.com/dotnet/api/azure.identity.devicecodecredential
var deviceCodeCredential = new DeviceCodeCredential(
callback, tenantId, clientId, options);
var graphClient = new GraphServiceClient(deviceCodeCredential, scopes);
Provedor integrado do Windows
O fluxo integrado do Windows fornece uma maneira para computadores Windows adquirirem silenciosamente um token de acesso quando eles forem ingressados no domínio. Para obter detalhes, consulte Autenticação do Windows.
No Azure.Identity momento, o pacote não dá suporte à autenticação integrada do Windows. Em vez disso, crie um provedor de autenticação personalizado usando a MSAL.
var scopes = new[] { "User.Read" };
// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";
// Value from app registration
var clientId = "YOUR_CLIENT_ID";
var pca = PublicClientApplicationBuilder
.Create(clientId)
.WithTenantId(tenantId)
.Build();
// DelegateAuthenticationProvider is a simple auth provider implementation
// that allows you to define an async function to retrieve a token
// Alternatively, you can create a class that implements IAuthenticationProvider
// for more complex scenarios
var authProvider = new DelegateAuthenticationProvider(async (request) => {
// Use Microsoft.Identity.Client to retrieve token
var result = await pca.AcquireTokenByIntegratedWindowsAuth(scopes).ExecuteAsync();
request.Headers.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", result.AccessToken);
});
var graphClient = new GraphServiceClient(authProvider);
Provedor interativo
O fluxo interativo é usado por aplicativos móveis (Xamarin e UWP) e aplicativos de área de trabalho para chamar o Microsoft Graph em nome de um usuário. Para obter detalhes, consulte Adquirir tokens interativamente.
var scopes = new[] { "User.Read" };
// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";
// Value from app registration
var clientId = "YOUR_CLIENT_ID";
// using Azure.Identity;
var options = new InteractiveBrowserCredentialOptions
{
TenantId = tenantId,
ClientId = clientId,
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
// MUST be http://localhost or http://localhost:PORT
// See https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/System-Browser-on-.Net-Core
RedirectUri = new Uri("http://localhost"),
};
// https://docs.microsoft.com/dotnet/api/azure.identity.interactivebrowsercredential
var interactiveCredential = new InteractiveBrowserCredential(options);
var graphClient = new GraphServiceClient(interactiveCredential, scopes);
Provedor de nome de usuário/senha
O provedor de nome de usuário/senha permite que um aplicativo conecte um usuário usando seu nome de usuário e senha. Use esse fluxo somente quando não for possível usar nenhum dos outros fluxos OAuth. Para obter mais informações, plataforma de identidade da Microsoft a credencial de senha do proprietário do recurso OAuth 2.0
var scopes = new[] { "User.Read" };
// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";
// Value from app registration
var clientId = "YOUR_CLIENT_ID";
// using Azure.Identity;
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
var userName = "adelev@contoso.com";
var password = "P@ssword1!";
// https://docs.microsoft.com/dotnet/api/azure.identity.usernamepasswordcredential
var userNamePasswordCredential = new UsernamePasswordCredential(
userName, password, tenantId, clientId, options);
var graphClient = new GraphServiceClient(userNamePasswordCredential, scopes);
Próximas etapas
- Para obter exemplos de código que mostram como usar o plataforma de identidade da Microsoft para proteger diferentes tipos de aplicativo, consulte plataforma de identidade da Microsoft de código (ponto de extremidade v2.0).
- Os provedores de autenticação exigem uma ID de cliente. Você desejará registrar seu aplicativo depois de configurar seu provedor de autenticação.
- Informe-nos se atualmente não há suporte para um fluxo OAuth necessário votando ou abrindo uma solicitação de recurso do Microsoft Graph.
Comentários
Enviar e exibir comentários de