7
votes

Intégrer le rapport Power BI sur le site web asp.net

J'ai un site Web ASP.NET CORE 1.1 et je souhaite incorporer les rapports Power BI sur le site.

Documentation de données hébergée Azure: https://Powerbi.microsoft.com/en-us/documentation/powerbi-Developer-Embed-sample-app- Possède-Data / P>

Utilisation de l'application Possède des données fort> Sample trouvées à https://github.com/microsoft/powerbi-developer-semples J'ai une solution de rapports intégrés au travail à l'aide de l'échantillon. Toutefois, le projet d'échantillon s'exécute sur .NET Framework 4.5.2 et lorsque vous essayez de migrer la solution dans mon application de base .NET, j'ai migré le code, mais l'activeDirectoryLibrary (Microsoft.identityModel.clients.ACtiveDirectoryLibrary) n'est pas contenir une méthode pour userpasswordCredential p> xxx pré>

la solution que j'ai trouvée recommandée en ligne pour ASP.NET CORE consiste à utiliser une aide d'une étiquette toutefois que le service Power BI intégré et Power BI a Conversion avec la nouvelle arrivée du pouvoir BI Premium, je ne pense pas que cette solution est possible en raison de la dépencence sur l'authentification de jeton pour les données hébergées de l'application. p>

Méthode de contrôleur complet de rapport: P>

            var url = APIHelper.BaseUrl;
        var content = new Dictionary<string, string>();
        content["grant_type"] = "password";
        content["resource"] = "https://analysis.windows.net/powerbi/api";
        content["username"] = "<username>";
        content["password"] = "<password>";
        content["client_id"] = "<clientid>";

        var response = await APIHelper.MakeAsyncRequest(url, content);
        var result = response.Content.ReadAsStringAsync().Result;
        var AAD = JsonConvert.DeserializeObject<AAD>(result);


4 commentaires

Pouvez-vous s'il vous plaît mettre votre code de contrôleur final complet dans? J'essaie de faire la même chose - votre travail est excellent mais je pense que je manque une pièce ou 2


@toy, excuses concernant la réponse retardée. Malheureusement, je ne pense pas que j'ai le code source plus, il faudra jeter un oeil à mes archives et vous contactera


Pas de soucis - je pensais que la pièce manquante était que le point final avait changé du code d'origine (c.-à-d. Le trucs avant le vôtre) et je ne l'ai pas attrapé mais maintenant tout va bien - merci de vous remercier


Vérifiez cet article sur: Power BI Power Rapports avec ASP.NET CORE


4 Réponses :


10
votes

Le flux de références de mot de passe du propriétaire de la ressource n'est pas pris en charge pour le noyau .NET pour la bibliothèque d'authentification Active Directory.

comme solution de contournement, vous pouvez composer la demande HTTP directement. Voici un exemple de référence: P>

POST https://login.microsoftonline.com/{tenant}/oauth2/token 
Content-Type: application/x-www-form-urlencoded

grant_type=password
&resource={resource}
&username={username}
&password={password}
&client_id={clientid}
&client_secret={client_secret}//if it is confidential app


0 commentaires

3
votes

Vous ne savez pas combien d'autres personnes apparaîtront à cette question en ce qui concerne l'adaptation du code d'échantillon PowerBI intégré d'Apple-Data-Données à la noyau .NET, mais j'ai pu obtenir des choses avec succès et faire fonctionner par l'échantillon de Melding Tchad classes avec le code de Ce message de la communauté Powerbi.

La clé (pour moi au moins) suivait la suggestion dans le poste PowerBI pour échanger ce code dans l'exemple d'origine: P>

public class DashboardController : Controller
{

    private static readonly string Username = "yourUN";
    private static readonly string Password = "yourPW";
    private static readonly string AuthorityUrl = "https://login.windows.net/common/oauth2/authorize/";
    private static readonly string ResourceUrl = "https://analysis.windows.net/powerbi/api";
    private static readonly string ClientId = "yourClientId";
    private static readonly string ApiUrl = "https://api.powerbi.com";
    private static readonly string GroupId = "yourGroupId";
    private static readonly string ReportId = "yourReportId";


    public class APIHelper 
    {
        #region Settings

        public static string BaseUrl
        {
            get
            {
                return "https://login.microsoftonline.com/common/oauth2/token";
            }
        }

        #endregion

        public static async Task<HttpResponseMessage> MakeAsyncRequest(string url, Dictionary<string, string> content)
        {
            var httpClient = new HttpClient
            {
                Timeout = new TimeSpan(0, 5, 0),
                BaseAddress = new Uri(url)
            };

            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type: application/x-www-form-urlencoded", "application/json");

            if (content == null)
            {
                content = new Dictionary<string, string>();
            }

            var encodedContent = new FormUrlEncodedContent(content);

            var result = await httpClient.PostAsync(httpClient.BaseAddress, encodedContent);

            return result;
        }    
    }


    public class AAD
    {
        [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; }
    }




    public async Task<ActionResult> Index(string username, string roles)
    {
        var url = APIHelper.BaseUrl;
        var content = new Dictionary<string, string>();
        content["grant_type"] = "password";
        content["resource"] = "https://analysis.windows.net/powerbi/api";
        content["username"] = Username;
        content["password"] = Password;
        content["client_id"] = ClientId;

        var response = await APIHelper.MakeAsyncRequest(url, content);
        var tokenresult = response.Content.ReadAsStringAsync().Result;
        var AAD = JsonConvert.DeserializeObject<AAD>(tokenresult);

        var result = new EmbedConfig();
        try
        {
            result = new EmbedConfig { Username = username, Roles = roles };
            var error = GetWebConfigErrors();
            if (error != null)
            {
                result.ErrorMessage = error;

                return View(result);
            }

            // Create a user password cradentials.
            var authenticationResult = AAD;

            if (authenticationResult == null)
            {
                result.ErrorMessage = "Authentication Failed.";
                return View(result);
            }

            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(ApiUrl), tokenCredentials))
            {
                // Get a list of reports.
                var reports = await client.Reports.GetReportsInGroupAsync(GroupId);

                Report report;
                if (string.IsNullOrEmpty(ReportId))
                {
                    // Get the first report in the group.
                    report = reports.Value.FirstOrDefault();
                }

                else
                {
                    report = reports.Value.FirstOrDefault(r => r.Id == "3a447f03-ad31-4e78-a3f1-2a6c008fcd8e");
                }

                if (report == null)
                {
                    result.ErrorMessage = "Group has no reports.";
                    return View(result);
                }

                var datasets = await client.Datasets.GetDatasetByIdInGroupAsync(GroupId, report.DatasetId);
                result.IsEffectiveIdentityRequired = datasets.IsEffectiveIdentityRequired;
                result.IsEffectiveIdentityRolesRequired = datasets.IsEffectiveIdentityRolesRequired;
                GenerateTokenRequest generateTokenRequestParameters;
                // This is how you create embed token with effective identities

                generateTokenRequestParameters = new GenerateTokenRequest(accessLevel: "view");



                var tokenResponse = await client.Reports.GenerateTokenInGroupAsync(GroupId, report.Id, generateTokenRequestParameters);

                if (tokenResponse == null)
                {
                    result.ErrorMessage = "Failed to generate embed token.";
                    return View(result);
                }

                // Generate Embed Configuration.
                result.EmbedToken = tokenResponse;
                result.EmbedUrl = report.EmbedUrl;
                result.Id = report.Id;

                return View(result);

            }
        }
        catch (HttpOperationException exc)

        {
            result.ErrorMessage = string.Format("Status: {0} for ID: ({1})\r\nResponse: {2}\r\nRequestId: {3}", exc.Response.StatusCode, (int)exc.Response.StatusCode, exc.Response.Content, exc.Response.Headers["RequestId"].FirstOrDefault());
        }
        catch (Exception exc)
        {
            result.ErrorMessage = exc.ToString();
        }

        return View(result);

    }
}


5 commentaires

J'utilise votre échantillon et je reçois une erreur disant Invalid_Grant - Nom d'utilisateur et mot de passe invalides, bien que ce soit correct. Avez-vous une idée de la raison pour laquelle cela se passe?


Bonjour MAK, juste pour clarifier, avez-vous éditez les informations statiques des chaînes réadonnées pour refléter vos informations de compte PowerBI? De plus, pour être clair, vous mettriez idéalement mettre en œuvre une méthode permettant de référencer ces informations pour ne pas avoir de données sensibles dans votre code réel.


Oui, j'ai remplacé les valeurs de mon code. En outre, je vais utiliser une stratégie différente pour les données sensibles.


@Mak C'est probablement trop tard, mais j'ai eu les mêmes problèmes et j'ai fini par déterminer qu'ils étaient dus à des ADFS. J'ai posté une solution qui fonctionne pour moi sur ce fil.


Merci @tpankake, a eu du temps difficile à essayer de recréer le problème à ce stade (n'est plus un compte PowerBI lié à la base de code d'origine que je testais sur). Acclamations.




0
votes

Je l'ai résolu avec les extraits de code suivants. Il vous suffit de remplacer votre nom d'utilisateur et votre mot de passe de votre compte PowerBI, Client_ID, Client_secret, Authendpoint et Créer AzreeadTokenResponseddo classe. XXX PRE>

MAINTENANT, vous devez créer une classe AzreeadTokenResponsedto comme suit. P>

public class AzureAdTokenResponseDto
    {
        [JsonProperty("access_token")]
        public string AccessToken { get; set; }
    }


1 commentaires

Quel devrait être le point d'extrémité idéal oauth