嵌入带有身份验证错误的 PowerBI (AADSTS50076)

Embed PowerBI with authentication error (AADSTS50076)

我想在我的 Web 应用程序中嵌入一些 PowerBI 报表。我有一个以前项目的工作代码。现在,我有了一个新项目,其中包含新的 Active Directory 和新的 PowerBI。我在 Active Directory 中创建了一个新应用程序并且我有 TenantId。当我 运行 AcquireTokenAsync 时,我收到一个错误。

public async Task<bool> CreatePowerBIClient()
{
    bool rtn = false;

    if (client == null)
    {
        var credential = new UserPasswordCredential(SettingsModels.Username, SettingsModels.Password);

        var authenticationContext = new AuthenticationContext(SettingsModels.AuthorityUrl);
        var authenticationResult = await authenticationContext.AcquireTokenAsync(SettingsModels.ResourceUrl, 
                                    SettingsModels.ClientId, credential);

        if (authenticationResult != null)
        {
            var tokenCredentials = new TokenCredentials(authenticationResult.AccessToken, "Bearer");
            client = new PowerBIClient(new Uri(SettingsModels.ApiUrl), tokenCredentials);
            rtn = true;
        }
    }
    else
        rtn = true;

    return rtn;
}

{"error":"interaction_required","error_description":"AADSTS50076: Due to a configuration change made by your administrator, or because you moved to a new location, you must use multi-factor authentication to access '00000009-0000-0000-c000-000000000000'.\r\nTrace ID: 4d6fa156-0435-4c92-9746-b0e3d6bcdb00\r\nCorrelation ID: 0febdcc8-cd86-46e2-a7a5-0ec0705732bb\r\nTimestamp: 2020-09-17 12:20:40Z","error_codes":[50076],"timestamp":"2020-09-17 12:20:40Z","trace_id":"4d6fa156-0435-4c92-9746-b0e3d6bcdb00","correlation_id":"0febdcc8-cd86-46e2-a7a5-0ec0705732bb","error_uri":"https://login.microsoftonline.com/error?code=50076","suberror":"basic_action","claims":"{"access_token":{"capolids":{"essential":true,"values":["8abf28b1-2a8a-440a-821c-9874593bec9c","9f5f13cb-276e-49fe-ad14-829ce71aef09"]}}}"}: Unknown error

我检查了 Active Directory 中应用程序设置的权限,但找不到禁用多重身份验证的位置。不过我不是这个域的管理员。

我能做什么?

更新

我使用的是最新版本的 PowerBI 包,我用建议的代码替换了代码:

public async Task<bool> CreatePowerBIClient()
{
    bool rtn = false;

    if (client == null)
    {
        var authenticationContext = new AuthenticationContext(SettingsModels.AuthorityUrl);

        var credential = new ClientCredential(SettingsModels.ClientId, SettingsModels.ClientSecret);
        var authenticationResult = await authenticationContext.AcquireTokenAsync(SettingsModels.ResourceUrl, credential);

        if (authenticationResult != null)
        {
            var tokenCredentials = new TokenCredentials(authenticationResult.AccessToken, "Bearer");
            client = new PowerBIClient(new Uri(SettingsModels.ApiUrl), tokenCredentials);
            rtn = true;
        }
    }
    else
        rtn = true;

    return rtn;
}

具有这些值:

现在,我得到一个错误:

Response status code does not indicate success: 400 (BadRequest).

[AdalServiceException: AADSTS90002: Tenant 'authorize' not found. This may happen if there are no active subscriptions for the tenant. Check to make sure you have the correct tenant ID. Check with your subscription administrator.

我不知道是什么问题。我发现这个 post.

很有用

根据您的代码,我了解到您正在使用特定帐户获取连接到 PowerBI 报告的令牌。

您遇到的这个错误表明您正在传递启用了 MFA 的帐户的凭据。 MFA 在用户帐户级别而非应用程序级别启用。要克服此错误,您可以使用以下选项之一:

选项 1:

您可以尝试为您用于连接到报告的帐户寻求和豁免 MFA。或者,在许多组织中,最佳实践是使用权限最少的服务帐户,而无需启用 MFA 来执行自动化任务。您可以通过授予这些帐户之一访问权限来连接到报告。

这不需要对您的代码进行任何更改。

选项 2:

您可以生成一个 App Only Token。您正在制作一个应用程序以针对 Azure AD 进行身份验证并使用该报告。 MFA 将完全不在画面中。

应用需要获得报告所在工作区的权限。

下面的代码片段获取 App only token

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

有关如何为应用程序创建和授予权限的详细步骤,您可以参考此article

注:

这需要由 PowerBI 服务管理员在 PowerBI 服务中启用一个设置才能通过此方法使用报告。