Mostrar archivos de usuario

Completado

Para que un usuario pueda descargar un archivo, es necesario mostrar una lista de los archivos disponibles. En este módulo, los archivos estarán en la raíz del OneDrive para la Empresa del usuario. Es posible que quiera subir un archivo o dos para empezar. Para acceder a la instancia de OneDrive para la Empresa, busque https://www.office.com, inicie sesión y seleccione el icono de OneDrive.

Decidir qué permisos requiere la aplicación

Todos los datos expuestos por Microsoft Graph están protegidos y la aplicación debe tener los permisos adecuados concedidos para acceder a ellos. El permiso necesario depende del tipo de información a la que la aplicación necesita acceder. Por ejemplo, para acceder al calendario del usuario, la aplicación debe tener el permiso Calendars.Read. Para leer los archivos de un usuario, la aplicación necesita el permiso Files.Read. Más adelante, cuando llegue el momento de cargar archivos, la aplicación necesitará el permiso de Files.ReadWrite. La lista exacta de los permisos necesarios para cada operación está disponible en la referencia de la API de Microsoft Graph.

Si la aplicación carga diferentes tipos de datos, los usuarios deben concederle varios permisos necesarios para acceder a esta información. Se recomienda que en la aplicación solicite solo los permisos que necesite.

Obtener los permisos necesarios

La lista de permisos concedidos a la aplicación se integra directamente en el token de acceso. El estándar de OAuth los llama “ámbitos”. Cuando la aplicación usa MSAL para obtener el token de acceso, debe incluir una lista de ámbitos en la solicitud a Microsoft Entra ID. Cada operación en Microsoft Graph tiene su propia lista de ámbitos. Si el token de acceso no tiene uno de ellos, se denegará la solicitud.

La aplicación de ejemplo almacena los permisos necesarios en el archivo appsettings.json en una propiedad Scopes tal como vio anteriormente.

"Scopes": "user.read presence.read mailboxsettings.read files.readwrite"

El valor de la propiedad Scopes es usado por el middleware ASP.NET Core de la aplicación, que controla la recuperación de un token de acceso después de que el usuario inicia sesión correctamente.

Middleware: plataforma de identidad de Microsoft y Microsoft Graph

ASP.NET Core admite middleware que se puede usar para autenticar y autorizar a los usuarios. También se puede usar para recuperar un token que se puede usar para llamar a Microsoft Graph, insertar un objeto de SDK de Microsoft Graph denominado GraphServiceClient en la aplicación, crear una caché de tokens y mucho más. El middleware se configura en Startup.cs y controla las tareas siguientes.

  1. Recupere los permisos necesarios definidos en la propiedad Scopes de appsettings.json.
  2. Agregue compatibilidad para la autenticación con OpenId.
  3. Especifique que la aplicación es una aplicación web de la plataforma de identidad de Microsoft que requiere un flujo de código de autenticación.
  4. Agregue la capacidad de llamar a las API de Microsoft Graph con permisos específicos.
  5. Habilite la inserción de dependencias para GraphServiceClient (un objeto proporcionado por el SDK de Microsoft Graph que se usa para realizar llamadas a Microsoft Graph).
  6. Agregue una caché de tokens en memoria.
  7. Requiera un usuario autenticado para acceder a la aplicación.
  8. Habilite la compatibilidad con Razor Pages.
  9. Agregue páginas de la interfaz de usuario de Microsoft Identity que proporcionen compatibilidad con el inicio y cierre de sesión del usuario.

Puede ver cada uno de estos pasos en el código siguiente definido en el ConfigureServices()method de Startup.cs.

// 1. Retrieve required permissions from appsettings
string[] initialScopes =
Configuration.GetValue<string>("DownstreamApi:Scopes")?.Split(' ');


services
  // 2. Add support for OpenId authentication
  .AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)

  // 3. Microsoft identity platform web app that requires an auth code flow
  .AddMicrosoftIdentityWebApp(Configuration)

  // 4. Add ability to call Microsoft Graph APIs with specific permissions
  .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)

  // 5. Enable dependency injection for GraphServiceClient
  .AddMicrosoftGraph(Configuration.GetSection("DownstreamApi"))

  // 6. Add in-memory token cache
  .AddInMemoryTokenCaches();


// 7. Require an authenticated user
services.AddControllersWithViews(options =>
{
  var policy = new AuthorizationPolicyBuilder()
      .RequireAuthenticatedUser()
      .Build();
  options.Filters.Add(new AuthorizeFilter(policy));
});

services
  // 8. Add Razor Pages support
  .AddRazorPages()

  // 9. Add Microsoft Identity UI pages that provide user
  // sign-in and sign-out support
  .AddMicrosoftIdentityUI();

Recuperar los archivos del directorio raíz de OneDrive del usuario mediante Microsoft Graph

Una vez configurado el middleware necesario, la aplicación controlará automáticamente el inicio de sesión del usuario y la recuperación del token de acceso. A continuación, el token de acceso se puede usar para recuperar los archivos de un usuario, ya que contendrá los permisos necesarios. Veamos cómo funciona ese proceso.

Para obtener los archivos de un usuario, use el recurso /me/drive/root/children. Es más fácil obtener los archivos de la carpeta raíz del directorio raíz de OneDrive del usuario actual porque Microsoft Graph proporciona accesos directos como /me y /root.

Para enumerar los archivos de la carpeta Documents de otro usuario, necesitará el identificador de usuario y el identificador de elemento de su carpeta Documents como se muestra a continuación:

/users/{user-id}/drive/items/{item-id}/children

Sugerencia

Microsoft Graph proporciona acceso a los archivos de OneDrive, OneDrive para la Empresa y SharePoint Online. Microsoft Teams y otros servicios de Microsoft 365 almacenan archivos en OneDrive para la Empresa y SharePoint Online. Las operaciones de archivo son las mismas, pero los recursos (direcciones URL) son un poco diferentes para cada uno de estos servicios.

Para recuperar los archivos del usuario que ha iniciado sesión, se puede usar el código siguiente:

var response = await _graphServiceClient.Me.Drive.Root.Children
    .Request()
    .GetAsync();

Puede hacer que la llamada sea más eficaz especificando las propiedades de datos específicas necesarias. La definición de las propiedades se controla mediante el métodoSelect. Observe que los métodos se pueden encadenar para facilitar la lectura de la solicitud.

var response = await _graphServiceClient.Me.Drive.Root.Children
    .Request()
    .Select(file => new
    {
        file.Id,
        file.Name,
        file.Folder,
        file.Package
    })
    .GetAsync();

El código siguiente se puede usar para recuperar archivos para un usuario diferente suponiendo que estén disponibles los permisos de seguridad adecuados:

var response = await _graphServiceClient
  .Users[userId]
  .Drive
  .Items[itemId]
  .Children
  .Request()
  .Select(file => new
  {
    file.Id,
    file.Name,
    file.Folder,
    file.Package
  })
  .GetAsync();

Siguientes pasos

Vamos a poner todo lo que ha aprendido a practicar y ampliar la aplicación para mostrar una lista de archivos en la carpeta raíz OneDrive para la Empresa del usuario.