Forum Discussion

phathoang's avatar
phathoang
Frequent Visitor
9 years ago
Solved

Couldn't get token with .Net Core

Is there any way to get token with .Net Core project? I couldn't resolve "Microsoft.PowerBI.Api" and "Microsoft.IdentityModel.Clients.ActiveDirectory" packages in .Net Core project. It requires .net framework.

  • phathoang

    May I know the reason why not resolve those packages? Anyway, one way to get data with username and password through pure REST API call.

     

    using System;
    using System.Net;
    //Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory -Version 2.21.301221612
    //using Microsoft.IdentityModel.Clients.ActiveDirectory;
    //Install-Package Newtonsoft.Json 
    using Newtonsoft.Json;
    using System.IO;
    using System.Web;
    using System.Collections.Specialized;
    
    namespace ConsoleApplication39
    {
    
        class Program
        {
    
            //Step 1 - Replace {client id} with your client app ID. 
            //To learn how to get a client app ID, see Register a client app (https://msdn.microsoft.com/en-US/library/dn877542.aspx#clientID)
            private static string clientID = "client id";
    
            //RedirectUri you used when you registered your app.
            //For a client app, a redirect uri gives AAD more details on the specific application that it will authenticate.
            private static string redirectUri = "https://login.live.com/oauth20_desktop.srf";
    
            //Resource Uri for Power BI API
            private static string resourceUri = "https://analysis.windows.net/powerbi/api";
    
            //OAuth2 authority Uri
            private static string authority = "https://login.windows.net/common/oauth2/authorize";
    
            //the account used to login Power BI
            private static string username = "pbiaccount";
            private static string password = "pbipassword";
    
            private static string token = String.Empty;
     
    
            static void Main(string[] args)
            {
    
                /**
                 the way use Microsoft.IdentityModel.Clients.ActiveDirectory 
                **/
                //getAccessTokenWithLoginPopUp()
    
                getAccessTokenSilently();
                Console.WriteLine(token);
    
                Console.ReadKey();
    
            }
    
    
            static void getAccessTokenSilently()
            {
                string resourceUri = "https://analysis.windows.net/powerbi/api";
                HttpWebRequest request = System.Net.HttpWebRequest.CreateHttp("https://login.windows.net/common/oauth2/token");
                //POST web request to create a datasource.
                request.KeepAlive = true;
                request.Method = "POST";
                request.ContentLength = 0;
                request.ContentType = "application/x-www-form-urlencoded";
    
                NameValueCollection parsedQueryString = HttpUtility.ParseQueryString(String.Empty);
                parsedQueryString.Add("client_id", clientID);
                parsedQueryString.Add("grant_type", "password");
                parsedQueryString.Add("resource", resourceUri);
                parsedQueryString.Add("username", username);
                parsedQueryString.Add("password", password);
                string postdata = parsedQueryString.ToString();
    
    
                //POST web request
                byte[] dataByteArray = System.Text.Encoding.ASCII.GetBytes(postdata); ;
                request.ContentLength = dataByteArray.Length;
    
                try
                {
                    //Write JSON byte[] into a Stream
                    using (Stream writer = request.GetRequestStream())
                    {
                        writer.Write(dataByteArray, 0, dataByteArray.Length);
                        var response = (HttpWebResponse)request.GetResponse();
                        var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
                        dynamic responseJson = JsonConvert.DeserializeObject<dynamic>(responseString);
                        token =  responseJson["access_token"];
                    }
                }
                catch (WebException wex)
                {
                    if (wex.Response != null)
                    {
                        using (var errorResponse = (HttpWebResponse)wex.Response)
                        {
                            using (var reader = new StreamReader(errorResponse.GetResponseStream()))
                            {
                                string errorString = reader.ReadToEnd();
                                dynamic respJson = JsonConvert.DeserializeObject<dynamic>(errorString);
                                Console.WriteLine(respJson);
                                //TODO: use JSON.net to parse this string and look at the error message
                            }
                        }
                    }
                } 
    
            }
    
            /**
            static string getAccessTokenWithLoginPopUp()
            {
                if (token == String.Empty)
                {
                    //Get Azure access token
                    // Create an instance of TokenCache to cache the access token
                    TokenCache TC = new TokenCache();
                    // Create an instance of AuthenticationContext to acquire an Azure access token
                    authContext = new AuthenticationContext(authority, TC);
                    // Call AcquireToken to get an Azure token from Azure Active Directory token issuance endpoint
                    token = authContext.AcquireToken(resourceUri, clientID, new Uri(redirectUri), PromptBehavior.RefreshSession).AccessToken;
                }
                else
                {
                    // Get the token in the cache
                    token = authContext.AcquireTokenSilent(resourceUri, clientID).AccessToken;
                }
    
                return token;
            }
        **/
    
    
            }
        }
    

2 Replies

  • Eric_Zhang's avatar
    Eric_Zhang
    Microsoft Employee

    phathoang

    May I know the reason why not resolve those packages? Anyway, one way to get data with username and password through pure REST API call.

     

    using System;
    using System.Net;
    //Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory -Version 2.21.301221612
    //using Microsoft.IdentityModel.Clients.ActiveDirectory;
    //Install-Package Newtonsoft.Json 
    using Newtonsoft.Json;
    using System.IO;
    using System.Web;
    using System.Collections.Specialized;
    
    namespace ConsoleApplication39
    {
    
        class Program
        {
    
            //Step 1 - Replace {client id} with your client app ID. 
            //To learn how to get a client app ID, see Register a client app (https://msdn.microsoft.com/en-US/library/dn877542.aspx#clientID)
            private static string clientID = "client id";
    
            //RedirectUri you used when you registered your app.
            //For a client app, a redirect uri gives AAD more details on the specific application that it will authenticate.
            private static string redirectUri = "https://login.live.com/oauth20_desktop.srf";
    
            //Resource Uri for Power BI API
            private static string resourceUri = "https://analysis.windows.net/powerbi/api";
    
            //OAuth2 authority Uri
            private static string authority = "https://login.windows.net/common/oauth2/authorize";
    
            //the account used to login Power BI
            private static string username = "pbiaccount";
            private static string password = "pbipassword";
    
            private static string token = String.Empty;
     
    
            static void Main(string[] args)
            {
    
                /**
                 the way use Microsoft.IdentityModel.Clients.ActiveDirectory 
                **/
                //getAccessTokenWithLoginPopUp()
    
                getAccessTokenSilently();
                Console.WriteLine(token);
    
                Console.ReadKey();
    
            }
    
    
            static void getAccessTokenSilently()
            {
                string resourceUri = "https://analysis.windows.net/powerbi/api";
                HttpWebRequest request = System.Net.HttpWebRequest.CreateHttp("https://login.windows.net/common/oauth2/token");
                //POST web request to create a datasource.
                request.KeepAlive = true;
                request.Method = "POST";
                request.ContentLength = 0;
                request.ContentType = "application/x-www-form-urlencoded";
    
                NameValueCollection parsedQueryString = HttpUtility.ParseQueryString(String.Empty);
                parsedQueryString.Add("client_id", clientID);
                parsedQueryString.Add("grant_type", "password");
                parsedQueryString.Add("resource", resourceUri);
                parsedQueryString.Add("username", username);
                parsedQueryString.Add("password", password);
                string postdata = parsedQueryString.ToString();
    
    
                //POST web request
                byte[] dataByteArray = System.Text.Encoding.ASCII.GetBytes(postdata); ;
                request.ContentLength = dataByteArray.Length;
    
                try
                {
                    //Write JSON byte[] into a Stream
                    using (Stream writer = request.GetRequestStream())
                    {
                        writer.Write(dataByteArray, 0, dataByteArray.Length);
                        var response = (HttpWebResponse)request.GetResponse();
                        var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
                        dynamic responseJson = JsonConvert.DeserializeObject<dynamic>(responseString);
                        token =  responseJson["access_token"];
                    }
                }
                catch (WebException wex)
                {
                    if (wex.Response != null)
                    {
                        using (var errorResponse = (HttpWebResponse)wex.Response)
                        {
                            using (var reader = new StreamReader(errorResponse.GetResponseStream()))
                            {
                                string errorString = reader.ReadToEnd();
                                dynamic respJson = JsonConvert.DeserializeObject<dynamic>(errorString);
                                Console.WriteLine(respJson);
                                //TODO: use JSON.net to parse this string and look at the error message
                            }
                        }
                    }
                } 
    
            }
    
            /**
            static string getAccessTokenWithLoginPopUp()
            {
                if (token == String.Empty)
                {
                    //Get Azure access token
                    // Create an instance of TokenCache to cache the access token
                    TokenCache TC = new TokenCache();
                    // Create an instance of AuthenticationContext to acquire an Azure access token
                    authContext = new AuthenticationContext(authority, TC);
                    // Call AcquireToken to get an Azure token from Azure Active Directory token issuance endpoint
                    token = authContext.AcquireToken(resourceUri, clientID, new Uri(redirectUri), PromptBehavior.RefreshSession).AccessToken;
                }
                else
                {
                    // Get the token in the cache
                    token = authContext.AcquireTokenSilent(resourceUri, clientID).AccessToken;
                }
    
                return token;
            }
        **/
    
    
            }
        }
    
    • phathoang's avatar
      phathoang
      Frequent Visitor

      Thanks for your suggested solution. It works perfectly. I just worry about if PowerBI changes any url or queryParameter when my app is runing. That may make my embedded report stop working any more.