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

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

Diagram that shows accessing 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 Microsoft Entra ID 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 de Azure 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.

  1. En App Service, seleccione Identidad en el panel izquierdo y, a continuación, Asignado por el sistema.

  2. 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.

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

Screenshot that shows the system-assigned identity.

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 el Centro de administración de Microsoft Entra.

  1. Ejecute el siguiente script para agregar los permisos de Microsoft Graph API solicitados al objeto de la entidad de servicio de la identidad administrada.

    # Install the module.
    # Install-Module Microsoft.Graph -Scope CurrentUser
    
    # The tenant ID
    $TenantId = "11111111-1111-1111-1111-111111111111"
    
    # The name of your web app, which has a managed identity.
    $webAppName = "SecureWebApp-20201106120003" 
    $resourceGroupName = "SecureWebApp-20201106120003ResourceGroup"
    
    # The name of the app role that the managed identity should be assigned to.
    $appRoleName = "User.Read.All"
    
    # Get the web app's managed identity's object ID.
    Connect-AzAccount -Tenant $TenantId
    $managedIdentityObjectId = (Get-AzWebApp -ResourceGroupName $resourceGroupName -Name $webAppName).identity.principalid
    
    Connect-MgGraph -TenantId $TenantId -Scopes 'Application.Read.All','AppRoleAssignment.ReadWrite.All'
    
    # Get Microsoft Graph app's service principal and app role.
    $serverApplicationName = "Microsoft Graph"
    $serverServicePrincipal = (Get-MgServicePrincipal -Filter "DisplayName eq '$serverApplicationName'")
    $serverServicePrincipalObjectId = $serverServicePrincipal.Id
    
    $appRoleId = ($serverServicePrincipal.AppRoles | Where-Object {$_.Value -eq $appRoleName }).Id
    
    # Assign the managed identity access to the app role.
    New-MgServicePrincipalAppRoleAssignment `
        -ServicePrincipalId $managedIdentityObjectId `
        -PrincipalId $managedIdentityObjectId `
        -ResourceId $serverServicePrincipalObjectId `
        -AppRoleId $appRoleId
    
  2. Después de ejecutar el script, puede comprobar en el Centro de administración de Microsoft Entra que los permisos de API solicitados están asignados a la identidad administrada.

  3. Vaya a Aplicaciones y, a continuación, Aplicaciones empresariales. Este panel muestra todas las entidades de servicio del inquilino. Agregue un filtro para "Tipo de aplicación==Identidades administradas" y 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 que aparece en Identidades administradasno debe tener una dirección URL de página principal enumerada y el valor de Id. de objeto debe coincidir con el valor del identificador de objeto de la identidad administrada del paso anterior.

  4. Seleccione la entidad de servicio para la identidad administrada.

    Screenshot that shows the All applications option.

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

    Screenshot that shows the Permissions pane.

Llamada a Microsoft Graph

Las clases ChainedTokenCredential, ManagedIdentityCredential y EnvironmentCredential se usan para obtener una credencial de token para el código a fin de autorizar las solicitudes a Microsoft Graph. Cree una instancia de la clase ChainedTokenCredential, que usa la identidad administrada en el entorno de App Service o las variables de entorno de desarrollo para capturar tokens y adjuntarlos al cliente de 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:

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.

Línea de comandos de .NET Core

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
dotnet add package Microsoft.Graph

Consola del Administrador de paquetes

Abra el proyecto o la solución en Visual Studio y abra la consola mediante Herramientas>Administrador de paquetes NuGet>Consola del Administrador de paquetes.

Ejecute los comandos de instalación.

Install-Package Microsoft.Identity.Web.MicrosoftGraph
Install-Package Microsoft.Graph

Ejemplo de .NET

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using Microsoft.Graph;
using Azure.Identity;

...

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

public async Task OnGetAsync()
{
    // Create the Graph service client with a ChainedTokenCredential which gets an access
    // token using the available Managed Identity or environment variables if running
    // in development.
    var credential = new ChainedTokenCredential(
        new ManagedIdentityCredential(),
        new EnvironmentCredential());

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

    var graphServiceClient = new GraphServiceClient(
        credential, scopes);

    List<MSGraphUser> msGraphUsers = new List<MSGraphUser>();
    try
    {
        //var users = await graphServiceClient.Users.Request().GetAsync();
        var users = await graphServiceClient.Users.GetAsync();
        foreach (var u in users.Value)
        {
            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ó.

Eliminar el grupo de recursos

En Azure Portal, seleccione Grupos de recursos en el menú del portal y seleccione el grupo de recursos que contenga su instancia de App Service y el plan de esta.

Seleccione Eliminar grupo de recursos para eliminar el grupo de recursos y todos los recursos.

Screenshot that shows deleting the resource group.

Este comando puede tardar varios minutos en ejecutarse.

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.