REST Api – Token de acceso ‘El servidor remoto devolvió un error: (401) No autorizado.’

Un usuario Pregunto ✅

MrRichDean

Buenos dias / tardes / noches a todos

En primer lugar, me disculpo por mi ignorancia y por cualquier pregunta estúpida que haga. Soy nuevo en Power BI, por lo que me encuentro muy bien.

Ok, entonces lo que estoy tratando de hacer es crear una pequeña aplicación de consola que obtenga el historial de actualización para un conjunto de datos en particular, pero estoy teniendo todo tipo de problemas con el token de acceso. Aquí está el código que tengo:

        private static string GetToken()
        {
            //OAuth2 authority Uri
            string authorityUri = "https://login.microsoftonline.com/common/";
         
            // AcquireToken will acquire an Azure access token
            // Call AcquireToken to get an Azure token from Azure Active Directory token issuance endpoint
            AuthenticationContext authContext = new AuthenticationContext(authorityUri);
            var credential = new ClientCredential(_clientId, _clientSecret);
            var authenticationResult = authContext.AcquireToken("https://analysis.windows.net/powerbi/api", credential);
            token = authenticationResult.AccessToken;

            HttpWebRequest request;
            var url = "https://api.powerbi.com/v1.0/myorg/datasets/{DATASETIDHERE}/refreshes/?$top=1";
            request = WebRequest.CreateHttp(url);
            request.Method = "GET";


            var tryItToken = "eyJ0eXAiO etc etc etc";

            //Add token to the request header
            request.Headers.Add("Authorization", String.Format("Bearer {0}", token));
            

            using (var response = (HttpWebResponse)request.GetResponse())
            {
                var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
                dynamic array = JsonConvert.DeserializeObject(responseString);
            }

            return token;
        }

tryItToken se completa con el token que se genera desde aquí https://docs.microsoft.com/en-us/rest/api/power-bi/datasets/getrefreshhistory.

Ahora, cada vez que paso la ficha de prueba, obtengo la respuesta absolutamente bien. Sin embargo, si reemplazo el tryItToken con el token que obtengo a través de authenticationcontext.AcquireToken, estoy recibiendo el 401 Unauthorized.

¿Alguien puede indicarme la dirección de los pasos que claramente me he perdido para que esto funcione correctamente desde el código?

Gracias por adelantado.

Hola @MrRichDean,

Me gustaría sugerirle que eche un vistazo al siguiente tutorial sobre cómo obtener un token de acceso si funciona de su lado:

Obtenga un token de acceso de autenticación

Saludos,

Xiaoxin Sheng

MrRichDean

En respuesta a v-shex-msft

Buenos días @ v-shex-msft

Intenté hacer esto en un intento anterior, pero cuando intenté usar el método asnyc, recibí lo siguiente;

MrRichDean_0-1599641170739.png

En respuesta a MrRichDean

Hola @MrRichDean,

Parece que la nueva versión del paquete NuGet cambia lo definido para que el código de la versión anterior no funcione. Intente usar el siguiente código que reemplaza la parte sin procesar si funciona de su lado:

private static string GetToken()
        {
            // and add using Microsoft.IdentityModel.Clients.ActiveDirectory

            //The client id that Azure AD created when you registered your client app.
            string clientID = "{Client_ID}";

            //RedirectUri you used when you register your app.
            //For a client app, a redirect uri gives Azure AD more details on the application that it will authenticate.
            // You can use this redirect uri for your client app
            string redirectUri = "https://login.live.com/oauth20_desktop.srf";

            //Resource Uri for Power BI API
            string resourceUri = "https://analysis.windows.net/powerbi/api";

            //OAuth2 authority Uri
            string authorityUri = "https://login.microsoftonline.com/common/";

            //Get access token:
            // To call a Power BI REST operation, create an instance of AuthenticationContext and call AcquireToken
            // AuthenticationContext is part of the Active Directory Authentication Library NuGet package
            // To install the Active Directory Authentication Library NuGet package in Visual Studio,
            //  run "Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory" from the nuget Package Manager Console.

            // AcquireToken will acquire an Azure access token
            // Call AcquireToken to get an Azure token from Azure Active Directory token issuance endpoint
            AuthenticationContext authContext = new AuthenticationContext(authorityUri);

            string token = authContext.AcquireTokenAsync(resourceUri, clientID, new Uri(redirectUri), (IPlatformParameters)new UserCredential()).Result.AccessToken;

            Console.WriteLine(token);
            Console.ReadLine();

            return token;
        }

Saludos,

Xiaoxin Sheng

MrRichDean

En respuesta a v-shex-msft

Gracias por tu hep @ v-shex-msft

Desafortunadamente, parece que a la nueva definición no le gusta IPlatformParameters

MrRichDean_0-1599738237063.png

En respuesta a MrRichDean

Hola @MrRichDean,

¿En qué versión del paquete NuGet está trabajando? Copio directamente el nombre del paquete NuGet (del documento) a vs studio package manager, luego lo descargo y lo pruebo con la última versión.

Saludos,

Xiaoxin Sheng

___Johan___

Hola,

Yo también soy nuevo. ¿AuthenticationContext completa el authotityUri correctamente?

Cuando uso curl, necesito llamar a http://login.microsoftonline.com/common/oauth2/token.

Atentamente

Johan

Deja un comentario

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