es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Código: BadRequest Mensaje: La solicitud /me solo es válida con el flujo de autenticación delegada.

Estoy intentando subir un archivo a OneDrive utilizando la API de Microsoft Graph OneDrive.
Estoy utilizando el método para autenticación “Proveedor de credenciales del cliente”.

https://learn.microsoft.com/es-es/graph/sdks/choose-authentication-providers?tabs=CS#client-credentials-provider

Por ejemplo:
“`// El flujo de credenciales del cliente requiere que solicites el
// alcance /.default y configures previamente tus permisos en el
// registro de la aplicación en Azure. Un administrador debe otorgar
// su consentimiento para esos permisos de antemano.
var scopes = new[] { "https://graph.microsoft.com/.default" };

// Las aplicaciones de varios inquilinos pueden usar "common",
// las aplicaciones de un solo inquilino deben usar el ID de inquilino
// del portal de Azure
var tenantId = "mi-id-de-inquilino";

// Valores del registro de la aplicación
var clientId = "TU-ID-DE-CLIENTE";
var clientSecret = "TU-SECRETO-DE-CLIENTE";

// utilizando Azure.Identity;
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};

// https://learn.microsoft.com/dotnet/api/azure.identity.clientsecretcredential
var clientSecretCredential = new ClientSecretCredential(
tenantId, clientId, clientSecret, options);

var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

<pre><code> HttpPostedFileBase file = Request.Files;[0];
int fileSize = file.ContentLength;
string fileName = file.FileName;
string mimeType = file.ContentType;
Stream fileContent = file.InputStream;

var res = await graphClient.Me.Drive.Root.ItemWithPath(fileName).Content
.Request()
.PutAsync<DriveItem>(fileContent);
</code></pre>

“`

Después de ejecutar este código, se produce un error en la respuesta.
Código: BadRequest
Mensaje: La solicitud de /me solo es válida con el flujo de autenticación delegada.
Error interno:
Datos adicionales:
fecha: 2021-12-29T05:30:08
identificador de solicitud: b51e50ea-4a62-4dc7-b8d2-b26d75268cdc
identificador de solicitud del cliente: b51e50ea-4a62-4dc7-b8d2-b26d75268cdc
Identificador de solicitud del cliente: b51e50ea-4a62-4dc7-b8d2-b26d75268cdc

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El mensaje de error sugiere que el flujo de autenticación que se está usando no es de autenticación delegada. En la autenticación delegada, el usuario debe dar su consentimiento para que la aplicación acceda a sus datos en su nombre.

    Para utilizar la autenticación delegada, debes cambiar el método de autenticación de Proveedor de credenciales de cliente a Proveedor de códigos de autorización.

    Aquí tienes cómo puedes modificar el código de autenticación:

    // establecer los ámbitos requeridos para la API de OneDrive
    var scopes = new[] { "Files.ReadWrite" };
    
    // establecer tenantId, clientId y clientSecret de la registración de la aplicación en Azure
    var tenantId = "{ID-del-tenant}";
    var clientId = "{ID-del-cliente}";
    var clientSecret = "{secreto-del-cliente}";
    
    // crear un proveedor de autenticación usando AuthorizationCodeProvider
    var authProvider = new AuthorizationCodeProvider(
        clientId,
        scopes,
        clientSecret,
        new Uri("{URI-de-redirección-base}/authorize"));
    
    var authProviderWithTenant = new TenantScopedProvider(tenantId, authProvider);
    
    // crear una instancia de GraphServiceClient con el proveedor de autenticación
    var graphClient = new GraphServiceClient(authProviderWithTenant);
    
    // obtener el archivo para cargarlo como un flujo de datos
    HttpPostedFileBase file = Request.Files[0];
    int fileSize = file.ContentLength;
    string fileName = file.FileName;
    string mimeType = file.ContentType;
    Stream fileContent = file.InputStream;
    
    // cargar el archivo en la carpeta raíz de OneDrive
    var res = await graphClient.Me.Drive.Root.ItemWithPath(fileName).Content
        .Request()
        .PutAsync<driveitem>(fileContent);
    

    En el código modificado, estamos utilizando Proveedor de códigos de autorización para la autenticación. También hemos agregado el ámbito Files.ReadWrite en la solicitud de autorización, ya que queremos cargar archivos.

    Asegúrate de agregar {URI-de-redirección-base}/authorize como una URI de redirección válida en la configuración de registración de la aplicación en Azure.

    Con estas modificaciones, el código debería poder cargar el archivo correctamente en OneDrive.

Comments are closed.