Forum Discussion

send2prasan's avatar
send2prasan
Helper I
8 years ago
Solved

Embed Power BI dashboard in ASP.Net core

Dear All,   We would like to Embed power bi dashboard in ASP.Net core web application not MVC based. I am struggling get a working example nor I am able to find step-by-step process to build this f...
  • jhorgan's avatar
    jhorgan
    8 years ago

    Hi, 

     

    The above suggestion from Eric_Zang won't work for Asp .Net Core as the UserPasswordCredentials is not supported in .NET Core. See: https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/issues/482

     

    I came across the same issues recently. My work-around was to use make a native REST call to the Azure AD for a token. I was pointed to this approach here: https://github.com/Microsoft/PowerBI-CSharp/issues/116

     

    My solution is as follows:

     

    Replace the following from Eric_Zang's example

    var credential = new UserPasswordCredential(Username, Password);
    
    // Authenticate using created credentials
    var authenticationContext = new AuthenticationContext(AuthorityUrl);
    var authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl, ClientId, credential);

    with:

     

    var authenticationResult = await AuthenticateAsync();
    
    private static async Task<OAuthResult> AuthenticateAsync()
    {
        var oauthEndpoint = new Uri(AuthorityUrl);
    
        using (var client = new HttpClient())
        {
            var result = await client.PostAsync(oauthEndpoint, new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("resource", ResourceUrl),
                new KeyValuePair<string, string>("client_id", ClientId),
                new KeyValuePair<string, string>("grant_type", "password"),
                new KeyValuePair<string, string>("username", Username),
                new KeyValuePair<string, string>("password", Password),
                new KeyValuePair<string, string>("scope", "openid"),
            }));
    
            var content = await result.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<OAuthResult>(content);
        }
    }
    
    class OAuthResult
    {
        [JsonProperty("token_type")]
        public string TokenType { get; set; }
        [JsonProperty("scope")]
        public string Scope { get; set; }
        [JsonProperty("experies_in")]
        public int ExpiresIn { get; set; }
        [JsonProperty("ext_experies_in")]
        public int ExtExpiresIn { get; set; }
        [JsonProperty("experies_on")]
        public int ExpiresOn { get; set; }
        [JsonProperty("not_before")] 
        public int NotBefore { get; set; }
        [JsonProperty("resource")]
        public Uri Resource { get; set; }
        [JsonProperty("access_token")]
        public string AccessToken { get; set; }
        [JsonProperty("refresh_token")]
        public string RefreshToken { get; set; }
    }

    I understand that using the OAuth Password grant was removed from ADAL for .NET Core to strongly discourage transporting and saving user credentials.

     

    I would like very much for a recommended approach for using PowerBI Embedded in as Asp .Net Core app.

     

    Hope this helps.

    Jeremy