Tutorial: Acceso a Microsoft Graph desde una aplicación protegida como aplicación

Aprenda a acceder a Microsoft Graph desde una aplicación web que se ejecuta en Azure App Service.

Diagrama que muestra el acceso a Microsoft Graph.

Quiere llamar a Microsoft Graph para la aplicación web. Una manera segura de dar acceso a los datos a la aplicación web es usar una identidad administrada asignada por el sistema. Una identidad administrada de Azure Active Directory permite a App Service acceder a los recursos a través del control de acceso basado en roles, sin necesidad de credenciales de aplicación. Después de asignar una identidad administrada a la aplicación web, Azure se encarga de la creación y distribución de un certificado. No tiene que preocuparse de administrar secretos ni credenciales de aplicaciones.

En este tutorial, aprenderá a:

  • Crear una identidad administrada asignada por el sistema en una aplicación web.
  • Agregar permisos de Microsoft Graph API a una identidad administrada.
  • Llamar a Microsoft Graph desde una aplicación web mediante identidades administradas.

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Requisitos previos

Habilitación de la identidad administrada en la aplicación

Si crea y publica la aplicación web mediante Visual Studio, habilitará la identidad administrada en la aplicación. En App Service, seleccione Identidad en el panel izquierdo y, a continuación, Asignado por el sistema. Compruebe que la opción Estado está establecida en Activo. Si no es así, seleccione Guardar y, a continuación, para habilitar la identidad administrada asignada por el sistema. Una vez habilitada la identidad administrada, el estado se establece en Activo y el identificador del objeto está disponible.

Tome nota del valor de Id. de objeto, ya que lo necesitará en el paso siguiente.

Captura de pantalla que muestra la identidad asignada por el sistema.

Concesión de acceso a Microsoft Graph

Al acceder a Microsoft Graph, la identidad administrada debe tener los permisos adecuados para la operación que desea realizar. Actualmente, no hay ninguna opción para asignar estos permisos mediante Azure Portal. El siguiente script agregará los permisos de Microsoft Graph API solicitados al objeto de la entidad de servicio de la identidad administrada.

# Install the module. (You need admin on the machine.)
# Install-Module AzureAD.

# Your tenant ID (in the Azure portal, under Azure Active Directory > Overview).
$TenantID="<tenant-id>"
$resourceGroup = "securewebappresourcegroup"
$webAppName="SecureWebApp-20201102125811"

# Get the ID of the managed identity for the web app.
$spID = (Get-AzWebApp -ResourceGroupName $resourceGroup -Name $webAppName).identity.principalid

# Check the Microsoft Graph documentation for the permission you need for the operation.
$PermissionName = "User.Read.All"

Connect-AzureAD -TenantId $TenantID

# Get the service principal for Microsoft Graph.
# First result should be AppId 00000003-0000-0000-c000-000000000000
$GraphServicePrincipal = Get-AzureADServicePrincipal -SearchString "Microsoft Graph" | Select-Object -first 1

# Assign permissions to the managed identity service principal.
$AppRole = $GraphServicePrincipal.AppRoles | `
Where-Object {$_.Value -eq $PermissionName -and $_.AllowedMemberTypes -contains "Application"}

New-AzureAdServiceAppRoleAssignment -ObjectId $spID -PrincipalId $spID `
-ResourceId $GraphServicePrincipal.ObjectId -Id $AppRole.Id

Después de ejecutar el script, puede comprobar en Azure Portal que los permisos de API solicitados están asignados a la identidad administrada.

Vaya a Azure Active Directory y, luego, seleccione Aplicaciones empresariales. Este panel muestra todas las entidades de servicio del inquilino. En Todas las aplicaciones, seleccione la entidad de servicio para la identidad administrada.

Si sigue este tutorial, hay dos entidades de servicio con el mismo nombre para mostrar (SecureWebApp2020094113531, por ejemplo). La entidad de servicio que tiene una dirección URL de la página principal representa la aplicación web en su inquilino. La entidad de servicio sin la dirección URL de la página principal representa la identidad administrada asignada por el sistema para la aplicación web. El valor de Id. de objeto de la identidad administrada coincide con el identificador de objeto de la identidad administrada que creó anteriormente.

Seleccione la entidad de servicio para la identidad administrada.

Captura de pantalla que muestra la opción Todas las aplicaciones.

En Información general, seleccione Permisos; verá los permisos agregados para Microsoft Graph.

Captura de pantalla que muestra el panel Permisos.

Llamada a Microsoft Graph (.NET)

Para obtener una credencial de token que el código pueda usar para autorizar solicitudes para Microsoft Graph, se utiliza la clase DefaultAzureCredential. Cree una instancia de la clase DefaultAzureCredential, que usa la identidad administrada para capturar los tokens y asociarlos al cliente del servicio. En el ejemplo de código siguiente se obtiene la credencial de token autenticada y se usa para crear un objeto de cliente del servicio que, luego, obtiene los usuarios del grupo.

Para ver este código como parte de una aplicación de ejemplo, consulte el ejemplo en GitHub.

Instalación del paquete de la biblioteca cliente Microsoft.Identity.Web.MicrosoftGraph

Instale el paquete NuGet Microsoft.Identity.Web.MicrosoftGraph en el proyecto utilizando la interfaz de la línea de comandos de .NET Core o la consola del administrador de paquetes de Visual Studio.

Abra una línea de comandos y cambie al directorio que contiene el archivo del proyecto.

Ejecute los comandos de instalación.

dotnet add package Microsoft.Identity.Web.MicrosoftGraph

Ejemplo

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Azure.Identity;
using Microsoft.Graph.Core;
using System.Net.Http.Headers;

...

public IList<MSGraphUser> Users { get; set; }

public async Task OnGetAsync()
{
    // Create the Microsoft Graph service client with a DefaultAzureCredential class, which gets an access token by using the available Managed Identity.
    var credential = new DefaultAzureCredential();
    var token = credential.GetToken(
        new Azure.Core.TokenRequestContext(
            new[] { "https://graph.microsoft.com/.default" }));

    var accessToken = token.Token;
    var graphServiceClient = new GraphServiceClient(
        new DelegateAuthenticationProvider((requestMessage) =>
        {
            requestMessage
            .Headers
            .Authorization = new AuthenticationHeaderValue("bearer", accessToken);

            return Task.CompletedTask;
        }));

    List<MSGraphUser> msGraphUsers = new List<MSGraphUser>();
    try
    {
        var users =await graphServiceClient.Users.Request().GetAsync();
        foreach(var u in users)
        {
            MSGraphUser user = new MSGraphUser();
            user.userPrincipalName = u.UserPrincipalName;
            user.displayName = u.DisplayName;
            user.mail = u.Mail;
            user.jobTitle = u.JobTitle;

            msGraphUsers.Add(user);
        }
    }
    catch(Exception ex)
    {
        string msg = ex.Message;
    }

    Users = msGraphUsers;
}

Limpieza de recursos

Si ya ha terminado con este tutorial y no necesita la aplicación web ni los recursos asociados, elimine los recursos que creó.

Pasos siguientes

En este tutorial, ha aprendido a:

  • Crear una identidad administrada asignada por el sistema en una aplicación web.
  • Agregar permisos de Microsoft Graph API a una identidad administrada.
  • Llamar a Microsoft Graph desde una aplicación web mediante identidades administradas.

Aprenda a conectar una aplicación de .NET Core, Python, Java o Node.js a una base de datos.