Escolher um fornecedor de autenticação do Microsoft Graph com base no cenário

Os fornecedores de autenticação implementam o código necessário para adquirir um token com a Biblioteca de Autenticação da Microsoft (MSAL), processam alguns potenciais erros para casos como consentimento incremental, palavras-passe expiradas e acesso condicional e, em seguida, definem o cabeçalho de autorização do pedido HTTP. A tabela seguinte lista os fornecedores que correspondem aos cenários de diferentes tipos de aplicações.

Cenário Fluxo/Concessão Espectadores Provedor
Aplicação de Página Única Código de Autorização com PKCE Consumidor/Organização Delegado Fornecedor de código de autorização
Aplicação Web que chama APIs Web
Código de Autorização Consumidor/Organização Delegado Fornecedor de código de autorização
Credenciais de Cliente Apenas aplicação Fornecedor de credenciais de cliente
API Web que chama APIs Web
Em Nome de Consumidor/Organização Delegado Fornecedor em nome de
Credenciais de Cliente Apenas aplicação Fornecedor de credenciais de cliente
Aplicação de ambiente de trabalho que chama APIs Web
Interativo Consumidor/Organização Delegado Fornecedor interativo
Windows integrado Organização Delegada Fornecedor integrado do Windows
Proprietário do Recurso Organização Delegada Fornecedor de nome de utilizador/palavra-passe
Código do Dispositivo Organização Delegada Fornecedor de código do dispositivo
Aplicação Daemon
Credenciais de Cliente Apenas aplicação Fornecedor de credenciais de cliente
Aplicação móvel que chama APIs Web
Interativo Consumidor/Organização Delegado Fornecedor interativo

Observação

Os fragmentos de código seguintes foram escritos com as versões mais recentes dos respetivos SDKs. Se encontrar erros de compilador com estes fragmentos, certifique-se de que tem as versões mais recentes. As seguintes bibliotecas de Identidade do Azure fornecem os fornecedores de autenticação utilizados:

Fornecedor de código de autorização

O fluxo de código de autorização permite que as aplicações Nativas e Web obtenham tokens no nome do utilizador de forma segura. Para saber mais, veja fluxo de código de autorização plataforma de identidade da Microsoft e 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 AuthorizationCodeCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

// https://video2.skills-academy.com/dotnet/api/azure.identity.authorizationcodecredential
var authCodeCredential = new AuthorizationCodeCredential(
    tenantId, clientId, clientSecret, authorizationCode, options);

var graphClient = new GraphServiceClient(authCodeCredential, scopes);

Fornecedor de credenciais de cliente

O fluxo de credenciais do cliente permite que as aplicações de serviço seja executadas sem interação do utilizador. O Access baseia-se na identidade da aplicação. Para obter mais informações, veja plataforma de identidade da Microsoft e o fluxo de credenciais de cliente OAuth 2.0.

Usando um certificado de cliente

var scopes = new[] { "https://graph.microsoft.com/.default" };

// Values from app registration
var clientId = "YOUR_CLIENT_ID";
var tenantId = "YOUR_TENANT_ID";
var clientCertificate = new X509Certificate2("MyCertificate.pfx");

// using Azure.Identity;
var options = new ClientCertificateCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

// https://video2.skills-academy.com/dotnet/api/azure.identity.clientcertificatecredential
var clientCertCredential = new ClientCertificateCredential(
    tenantId, clientId, clientCertificate, options);

var graphClient = new GraphServiceClient(clientCertCredential, scopes);

Utilizar um segredo do cliente

// The client credentials flow requires that you request the
// /.default scope, and pre-configure 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" };

// Values from app registration
var clientId = "YOUR_CLIENT_ID";
var tenantId = "YOUR_TENANT_ID";
var clientSecret = "YOUR_CLIENT_SECRET";

// using Azure.Identity;
var options = new ClientSecretCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

// https://video2.skills-academy.com/dotnet/api/azure.identity.clientsecretcredential
var clientSecretCredential = new ClientSecretCredential(
    tenantId, clientId, clientSecret, options);

var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

Fornecedor em nome de

O fluxo em nome de é aplicável quando a sua aplicação chama uma API de serviço/Web, que chama o microsoft API do Graph. Saiba mais ao ler plataforma de identidade da Microsoft e fluxo OAuth 2.0 On-Behalf-Of

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 OnBehalfOfCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

// This is the incoming token to exchange using on-behalf-of flow
var oboToken = "JWT_TOKEN_TO_EXCHANGE";

var onBehalfOfCredential = new OnBehalfOfCredential(
    tenantId, clientId, clientSecret, oboToken, options);

var graphClient = new GraphServiceClient(onBehalfOfCredential, scopes);

Fornecedor implícito

O fluxo de Autenticação Implícita não é recomendado devido às desvantagens. Os clientes públicos, como aplicações nativas e aplicações de página única, devem agora utilizar o fluxo de código de autorização com a extensão PKCE. Referência.

Fornecedor de código do dispositivo

O fluxo de código do dispositivo permite o início de sessão nos dispositivos através de outro dispositivo. Para obter detalhes, veja plataforma de identidade da Microsoft e o 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 DeviceCodeCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
    ClientId = clientId,
    TenantId = tenantId,
    // Callback function that receives the user prompt
    // Prompt contains the generated device code that user must
    // enter during the auth process in the browser
    DeviceCodeCallback = (code, cancellation) =>
    {
        Console.WriteLine(code.Message);
        return Task.FromResult(0);
    },
};

// https://video2.skills-academy.com/dotnet/api/azure.identity.devicecodecredential
var deviceCodeCredential = new DeviceCodeCredential(options);

var graphClient = new GraphServiceClient(deviceCodeCredential, scopes);

Fornecedor integrado do Windows

O fluxo integrado do Windows permite que os computadores Windows utilizem o Gestor de Conta Web (WAM) para adquirir um token de acesso quando associados a um domínio silenciosamente.

Observação

A autenticação através do WAM tem requisitos específicos. Veja Azure Identity Brokered Authentication client library (Biblioteca de cliente de Autenticação Mediada de Identidades do Azure) para obter detalhes.

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

// Get parent window handle
var parentWindowHandle = GetForegroundWindow();

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.Broker;
// This will use the Web Account Manager in Windows
var options = new InteractiveBrowserCredentialBrokerOptions(parentWindowHandle)
{
    ClientId = clientId,
    TenantId = tenantId,
};

// https://video2.skills-academy.com/dotnet/api/azure.identity.interactivebrowsercredential
var credential = new InteractiveBrowserCredential(options);

var graphClient = new GraphServiceClient(credential, scopes);

return graphClient;

Fornecedor interativo

O fluxo interativo é utilizado por aplicações móveis (Xamarin e UWP) e aplicações de ambiente de trabalho para chamar o Microsoft Graph em nome de um utilizador. Para obter detalhes, veja 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://video2.skills-academy.com/dotnet/api/azure.identity.interactivebrowsercredential
var interactiveCredential = new InteractiveBrowserCredential(options);

var graphClient = new GraphServiceClient(interactiveCredential, scopes);

Fornecedor de nome de utilizador/palavra-passe

O fornecedor de nome de utilizador/palavra-passe permite que uma aplicação inicie sessão num utilizador com o respetivo nome de utilizador e palavra-passe.

Observação

A Microsoft recomenda que utilize o fluxo de autenticação mais seguro disponível. O fluxo de autenticação descrito neste procedimento requer um grau muito elevado de confiança na aplicação e acarreta riscos que não estão presentes noutros fluxos. Só deve utilizar este fluxo quando outros fluxos mais seguros, como identidades geridas, não forem viáveis. Para obter mais informações, veja plataforma de identidade da Microsoft e a credencial de palavra-passe 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 UsernamePasswordCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

var userName = "adelev@contoso.com";
var password = "Password1!";

// https://video2.skills-academy.com/dotnet/api/azure.identity.usernamepasswordcredential
var userNamePasswordCredential = new UsernamePasswordCredential(
    userName, password, tenantId, clientId, options);

var graphClient = new GraphServiceClient(userNamePasswordCredential, scopes);

Próximas etapas