嵌入Power BI嵌入式会产生406 Not Acceptable错误

问题描述 投票:1回答:1

当我们尝试在现有应用程序中嵌入“Power BI embedded”时,我们遇到了406不接受的错误。为了确保这不是由我们自己的应用程序引起的,我们使用了power bi示例存储库中的示例代码:https://github.com/Microsoft/PowerBI-Developer-Samples。我们使用“App Owns Data”方案,因为我们的最终用户不拥有Power BI Pro许可证。我们遵循了所有必要的配置步骤,并在web.config中提供了必要的凭证/ ID。

在我们第一次尝试运行应用程序时,我们遇到了连接关闭错误。经过一些研究,我们发现这是由不正确的TLS版本引起的。将ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;添加到控制器解决了这个问题。

我们遇到的下一个错误是在以下代码行:

var authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl, ApplicationId, credential);

此行以http异常结束:406 - 不可接受。当我们使用Fiddler检查流量时,此错误被认为是合乎逻辑的,因为我们的Azure AD将我们的ADFS服务器称为具有JSON内容的接受标头的依赖方,而我们的ADFS返回了xml主体。我们的结论是AcquireTokenAsync无法与我们的企业Azure AD / ADFS环境一起正常运行。为了研究这个,我们进行了几项测试:

  1. 我们尝试使用MSAL lib,而不是使用标准的ADAL库。但是,这导致了同样的错误。
  2. 对Azure AD执行(原始)发布请求以获取具有以下代码的身份验证令牌:
    try
    {
        client.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
        _result = await client.PostAsync(
            new Uri("https://login.windows.net/common/oauth2/token"), new FormUrlEncodedContent(
                new[]
                {
                new KeyValuePair("resource", "https://analysis.windows.net/powerbi/api"),
                new KeyValuePair("client_id", ClientId),
                new KeyValuePair("grant_type", "password"),
                new KeyValuePair("username", UserName),
                new KeyValuePair("password", Password),
                new KeyValuePair("scope", "openid"),
                }));
    }
    catch (HttpOperationException ex)
    {
        //Bad Request
        var content = ex.Response.Content;
        Console.WriteLine(content);
    }

这导致以下错误,我们无法解决:

{“error”:“invalid_grant”,“error_description”:“AADSTS70002:验证凭据时出错.AADSTS50126:无效的用户名或密码\ r \ nTrace ID:b8a97eae-63a4-4d56-8afd-e18eb7b02800 \ r \ n相关ID:3e168d8f-61ab -4b7f-b9c4-6ae7870c5e06 \ r \ n时间戳:2018-12-03 12:59:38Z“,”error_codes“:[70002,50126],”timestamp“:”2018-12-03 12:59:38Z“, “trace_id的”: “b8a97eae-63a4-4d56-8afd-e18eb7b02800”, “CORRELATION_ID”: “3e168d8f-部61Ab-4b7f-b9c4-6ae7870c5e06”}

  1. 我们使用以下代码成功执行了交互式登录: var authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl, ApplicationId, new Uri("http://localhost:42734/"), new PlatformParameters(PromptBehavior.Auto));

但是,这并不理想,因为我们不希望我们的最终用户每次使用我们应用程序中嵌入的Power BI时,都会在我们的AD中使用代理帐户进行(交互式)登录:)

  1. 在关于这个场景的微软博客之后,也没有产生任何结果:https://blogs.msdn.microsoft.com/azuredev/2018/01/22/accessing-the-power-bi-apis-in-a-federated-azure-ad-setup/

问题是如何解决这个问题....请参阅下面的答案,我们在搜索数月(!)后发现。

.net asp.net-core powerbi powerbi-embedded
1个回答
0
投票

经过几个月的搜索,我在地球另一端的一位同事帮助了我。解决方案很简单:使用在Azure AD中创建但在依赖AD中未知的代理帐户。这样,身份验证将在Azure AD中进行,并且不使用依赖的ADFS。这可以防止我们遇到的所有错误,并启用ADAL和MSAL身份验证。

当我们开始在我们自己的.NET Core应用程序中嵌入Power BI时,我们发现post请求当前是最好的选择,因为我们在.NET Core库中找不到适当的用户名/密码auth方法。帖子请求也适用于前面提到的解决方案。

我希望这个提示可以节省一些人花在我们身上的时间......

© www.soinside.com 2019 - 2024. All rights reserved.