Obtener el token de acceso La aplicación C# posee un error de datos

Un usuario Pregunto ✅

Anónimo

Hola,

Tengo una aplicación web que usa un backend de API .NET y estoy tratando de conectarme a PowerBI Premium para obtener el token, pero cada vez que lo hago, aparece el mismo error.

AADSTS70002: El cuerpo de la solicitud debe contener el siguiente parámetro: ‘client_secret o client_assertion’.

Básicamente, lo que quiero hacer es presionar mi controlador API .NET, pasar un archivo PBIX seleccionado y luego usar el SDK de Power Bi para cargar y publicar el archivo en el espacio de trabajo de la aplicación Power Bi Premium. Luego, una vez que termine esta parte, crearé otra sección de mi aplicación donde los usuarios pueden ir a ver estos informes de power bi. En mi aplicación, la aplicación posee los datos, compré la licencia y configuré el usuario correctamente. También configuré el espacio de trabajo de la aplicación y lo configuré para que sea un espacio de trabajo premium.

También registré mi aplicación en https://dev.powerbi.com/apps como una aplicación web del lado del servidor. Estaba confundido con la URL de redirección, ya que no la necesito para redirigir mi aplicación a ninguna parte, ya que el usuario no debe ingresar las credenciales, pero dice que solo use cualquier URL válida, así que puse la página de inicio de mi aplicación. Luego le di todos los permisos y obtuve ClientId y Secret.

Luego traté de usar las mismas 3 o 4 líneas de código que veo como ejemplos en casi todos los sitios. Es un poco confuso porque no veo un lugar para ingresar el secreto del cliente que acabo de obtener al registrar mi aplicación, por lo que no estoy seguro si es solo para ver los informes en la aplicación o también, pero aquí están los líneas de código que utilicé que me dan ese error que publiqué arriba….

// Crear credenciales de contraseña de usuario.
var credencial = nueva credencial de usuario (nombre de usuario, contraseña);

// Autenticar usando las credenciales creadas
var AuthenticationContext = new AuthenticationContext(Url de autoridad);
var autentificaciónResult = aguardar autenticaciónContext.AcquireTokenAsync(ResourceUrl, ClientId, credencial);
var tokenCredentials = new TokenCredentials(authenticationResult.AccessToken, «Bearer»);

Estas son las URL que estoy usando en el código anterior….


Una vez que tenga el token, planeo usar el SDK de PowerBI para cargar el informe de esta manera…

var cliente = nuevo Microsoft.PowerBI.Api.V2.PowerBIClient(credenciales, controlador);
client.Imports.PostImportWithFileInGroup(GroupId, file1Stream, «importedreport», «Abort»);

Si alguien puede ayudarme a entender lo que estoy haciendo mal, se lo agradecería mucho. Estoy en una crisis de tiempo para hacer esto, y estoy en un punto en el que no estoy seguro de cómo proceder. Gracias.

@Anónimo

Para el escenario de datos de propiedad de la aplicación, registre una aplicación nativa en su lugar. Entonces todo funcionará.

@Anónimo

Para el escenario de datos de propiedad de la aplicación, registre una aplicación nativa en su lugar. Entonces todo funcionará.

Anónimo

En respuesta a Eric_Zhang

Para mí eso no tiene sentido. Mi aplicación no es un cliente nativo. Es una aplicación web con una API .NET. Así que supongo que esto me deja con una pregunta. Pude encontrar un código que realmente funcionó y me dio el token. Voy a pegar eso a continuación. Sin embargo, ¿cuál sugeriría usted que es el mejor enfoque? Para volver a registrarlo como Native Client, o usar el código que estoy usando actualmente.

PD: ahora tengo el token, pero cada vez que trato de usarlo para leer informes o cualquier cosa, me da un error prohibido 403. ¿Podría esto tener algo que ver con que la aplicación no esté registrada como un cliente nativo?

Gracias,

steven

// configurar la información de la aplicación para AuthenticationContext
var clientCredential = new ClientCredential(ClientId, ClientKey);
// crear contexto de autenticación (nota: no se aprovecha la memoria caché de token)
AuthenticationContext authContext = new AuthenticationContext(Url de autoridad);
// obtener token de acceso para Power BI
token = authContext.AcquireToken(ResourceUrl, clientCredential).AccessToken;

var tokenCredentials = new TokenCredentials(token, «Portador»);

Anónimo

En respuesta a Anónimo

La razón por la que obtuve el 403 Prohibido fue porque en realidad recibía un token, pero era el token incorrecto. Lo estaba entendiendo de la manera incorrecta. Una vez que cambié a hacerlo como se muestra a continuación, con la aplicación registrada como cliente nativo, todo funcionó muy bien.

// Crear credenciales de contraseña de usuario.
var credencial = nueva credencial de usuario (nombre de usuario, contraseña);
// Autenticar usando las credenciales creadas
var AuthenticationContext = new AuthenticationContext(Url de autoridad);
var autentificaciónResult = espera autenticaciónContext.AcquireTokenAsync(ResourceUrl, ClientId2, credencial);
token = resultado de autenticación.AccessToken;
var tokenCredentials = new TokenCredentials(authenticationResult.AccessToken, «Bearer»);

Gracias por toda tu ayuda.

Stizz001

Junilo

En respuesta a Anónimo

Debería haber PRESTADO ATENCIÓN a ‘registrar una aplicación nativa de AAD‘ todo funciona bien después de que hice eso (después de configurar los permisos de la aplicación en Azure Portal).

Pero tenga en cuenta para el equipo de Power BI: en mi humilde opinión, eso es un poco confuso. ‘Nativo’ como lo definimos, son aquellos que se ejecutan en Android, iOS, … Mi código C# se ejecuta en un servicio de back-end, no lo llamo ‘Nativo’

De todos modos.

Para los que siguen luchando, tirándose de los pelos (si aún te quedan, guárdalos)…

Para obtener ese token de inserción: este fragmento de código funciona para mí ahora

var embedToken = "";
var ClientId = "your-client-id-here-generated-when-after-you-registered-a-native-app";
var credential = new UserPasswordCredential("AADUserNameHere", "ADDUserPasswordHere");

var groupId = "Your-App-Workspace-GroupId-Here";
var reportId = "Your-ReportId-Here";

// Authenticate using created credentials
var authenticationContext = new AuthenticationContext("https://login.windows.net/common/oauth2/authorize/");
var authenticationResult = authenticationContext.AcquireTokenAsync("https://analysis.windows.net/powerbi/api", ClientId, credential).Result;

if (authenticationResult != null)
{
    var tokenCredentials = new TokenCredentials(authenticationResult.AccessToken, "Bearer");

    // Create a Power BI Client object. It will be used to call Power BI APIs.
    using (var client = new PowerBIClient(new Uri("https://api.powerbi.com/"), tokenCredentials))
    {
        // Generate Embed Token.
        var generateTokenRequestParameters = new GenerateTokenRequest(accessLevel: "view");
        var tokenResponse = client.Reports.GenerateTokenInGroup(groupId, reportId, generateTokenRequestParameters);

        if (tokenResponse == null)
        {
            throw new Exception("No token response");
        }

        embedToken = tokenResponse.Token;
    }
}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *