Elegir un proveedor de autenticación de Microsoft Graph según el escenario

Los proveedores de autenticación implementan el código necesario para adquirir un token mediante la Biblioteca de autenticación de Microsoft (MSAL); controlar una serie de errores potenciales para casos como el consentimiento incremental, las contraseñas expiradas y el acceso condicional; y, a continuación, establezca el encabezado de autorización de solicitud HTTP. En la tabla siguiente se muestra el conjunto de proveedores que coinciden con los escenarios de distintos tipos de aplicación.

Escenario Flow/Grant Público Proveedor
Aplicación de página única Código de autorización
con PKCE Consumidor delegado/org Proveedor de código de autorización
Aplicación web que llama a API web
Código de autorización Consumidor delegado/org Proveedor de código de autorización
Credenciales de cliente Solo aplicación Proveedor de credenciales de cliente
API web que llama a API web
En nombre de Consumidor delegado/org Proveedor en nombre de
Credenciales de cliente Solo aplicación Proveedor de credenciales de cliente
Aplicación de escritorio que llama a API web
Interactive Consumidor delegado/org Proveedor interactivo
Integración Windows Organización delegada Proveedor Windows integrado
Propietario de recursos Organización delegada Proveedor de nombre de usuario y contraseña
Código de dispositivo Organización delegada Proveedor de código de dispositivo
Aplicación demonio
Credenciales de cliente Solo aplicación Proveedor de credenciales de cliente
Aplicación móvil que llama a API web
Interactive Consumidor delegado/org Proveedor interactivo

Nota

Java y los desarrolladores de Android deben agregar la biblioteca de identidades de azure para obtener acceso a los distintos tipos de credenciales. Los desarrolladores de .NET deben agregar el paquete Azure.Identity para obtener acceso a los diferentes tipos de credenciales.

Proveedor de código de autorización

El flujo de código de autorización permite que las aplicaciones nativas y web obtengan tokens de forma segura en el nombre del usuario. Para obtener más información, vea Plataforma de identidad de Microsoft y flujo de código de autorización de 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";

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);

Proveedor de credenciales de cliente

El flujo de credenciales de cliente permite que las aplicaciones de servicio se ejecuten sin la interacción del usuario. El acceso se basa en la identidad de la aplicación. Para obtener más información, vea Plataforma de identidad de Microsoft y el flujo de credenciales de cliente de OAuth 2.0.

Uso de un secreto de cliente

var scopes = new[] { "User.Read.All" };

// 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";

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);

Con un certificado de cliente

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 clientCertificate = new X509Certificate2("MyCertificate.pfx");

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);

Proveedor en nombre de

El flujo en nombre del usuario es aplicable cuando la aplicación llama a una API de servicio/web que, a su vez, llama a la API Graph Microsoft. Para obtener más información, Plataforma de identidad de Microsoft y OAuth 2.0 On-Behalf-Of flow

El paquete no admite el flujo en nombre de la versión Azure.Identity 1.4.0. En su lugar, cree un proveedor de autenticación personalizado con 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";

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);

Proveedor implícito

No se recomienda el flujo de autenticación implícita debido a sus desventajas. Los clientes públicos, como las aplicaciones nativas y las aplicaciones de JavaScript, ahora deben usar el flujo de código de autorización con la extensión PKCE en su lugar. Referencia.

Proveedor de código de dispositivo

El flujo de código del dispositivo habilita el inicio de sesión en dispositivos a través de otro dispositivo. Para obtener más información, consulta Plataforma de identidad de Microsoft y el flujo de código de dispositivo de 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";

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);

Proveedor Windows integrado

El flujo de Windows integrado proporciona una forma de que Windows equipos adquieran silenciosamente un token de acceso cuando están unidos a un dominio. Para obtener más información, vea Integrated Windows authentication.

Actualmente, Azure.Identity el paquete no admite Windows autenticación integrada. En su lugar, cree un proveedor de autenticación personalizado con 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);

Proveedor interactivo

El flujo interactivo lo usan aplicaciones móviles (Xamarin y UWP) y aplicaciones de escritorio para llamar a Microsoft Graph en nombre de un usuario. Para obtener más información, consulte Adquisición de tokens de forma interactiva.

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 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);

Proveedor de nombre de usuario y contraseña

El proveedor de nombre de usuario/contraseña permite que una aplicación inicie sesión en un usuario mediante su nombre de usuario y contraseña. Use este flujo solo cuando no pueda usar ninguno de los demás flujos de OAuth. Para obtener más información, vea Plataforma de identidad de Microsoft y la credencial de contraseña del propietario del 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";

var options = new TokenCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};

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

var userNamePasswordCredential = new UsernamePasswordCredential(
    userName, password, tenantId, clientId, options);

var graphClient = new GraphServiceClient(userNamePasswordCredential, scopes);

Pasos siguientes

  • Para ver ejemplos de código que muestran cómo usar el Plataforma de identidad de Microsoft para proteger distintos tipos de aplicación, vea Plataforma de identidad de Microsoft ejemplos de código (punto de conexión v2.0).
  • Los proveedores de autenticación requieren un identificador de cliente. Querrá registrar la aplicación después de configurar el proveedor de autenticación.
  • Háganos saber si actualmente no se admite un flujo de OAuth necesario votando o abriendo una solicitud de característica de Microsoft Graph .