操作返回了无效的状态代码'未授权''

时间:2018-02-28 19:31:44

标签: c# wpf azure-active-directory powerbi-embedded

我正在尝试在示例项目和here的教程之后在WPF应用程序中嵌入示例Power BI仪表板。当我启动应用程序时,我必须输入我的密码来验证自己,当它尝试使用getAppWorkspacesList()获取我的Power BI工作区列表时,我收到此错误消息

  

Microsoft.Rest.HttpOperationException:'操作返回无效   状态代码'未授权''

有人可以帮忙指出为什么会出现这个错误吗?我试着查看错误的细节,但我不明白可能导致问题的原因。我能够在没有问题的情况下在.Net Web App中嵌入仪表板,因此我不认为问题出在我的Power BI或Azure Directory帐户中。

enter image description here

private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
Uri redirectUri = new Uri(ConfigurationManager.AppSettings["ida:RedirectUri"]);
private static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

private static string graphResourceId = ConfigurationManager.AppSettings["ida:ResourceId"];
private AuthenticationContext authContext = null;

TokenCredentials tokenCredentials = null;
string Token = null;
string ApiUrl = "https://api.powerbi.com";



public MainWindow()
{
    InitializeComponent();
    TokenCache TC = new TokenCache();
    authContext = new AuthenticationContext(authority, TC);
}


private void getAppWorkspacesList()
{
    using (var client = new PowerBIClient(new Uri(ApiUrl), tokenCredentials))
    {
        appWorkSpacesList.ItemsSource = client.Groups.GetGroups().Value.Select(g => new workSpaceList(g.Name, g.Id));                
    }
}

2 个答案:

答案 0 :(得分:2)

根据您的描述,我假设您正在为Power BI用户(用户拥有数据)方法使用Access令牌。我建议您在成功调用authContext.AcquireTokenAsync后使用https://jwt.io/解码access_token。确保audhttps://analysis.windows.net/powerbi/api并检查权限范围属性scp

对于Get Groups,所需范围如下:

  

所需范围:Group.Read.All或Group.ReadWrite.All或Workspace.Read.All或Workspace.ReadWrite.All

您还可以使用fiddler或postman通过WPF应用程序中收到的access_token来模拟针对get groups端点的请求,以缩小此问题。

此外,您可以按照Register an application检查Azure AD应用,并确保已正确配置 Power BI Service(Microsoft.Azure.AnalysisServices) API所需的委派权限。

答案 1 :(得分:0)

当我们使用应用拥有数据方法时,也会遇到相同的错误。 here描述了解决该问题的方法。

基本上,获取Microsoft website中记录的访问令牌的方法不起作用。我们最终对https://login.microsoftonline.com/common/oauth2/token进行了REST API调用,并发布了以下数据:

您将获得一个JSON,然后您可以获取将在创建power bi客户端时使用的access_token,如下所示:

    var mTokenCredentials = new TokenCredentials(accessToken, "Bearer");
    using (var client = new PowerBIClient(new Uri("https://api.powerbi.com"), mTokenCredentials))

我希望这可以帮助某人。 This是原始帖子。