我正在尝试在示例项目和here的教程之后在WPF应用程序中嵌入示例Power BI仪表板。当我启动应用程序时,我必须输入我的密码来验证自己,当它尝试使用getAppWorkspacesList()
获取我的Power BI工作区列表时,我收到此错误消息
Microsoft.Rest.HttpOperationException:'操作返回无效 状态代码'未授权''
有人可以帮忙指出为什么会出现这个错误吗?我试着查看错误的细节,但我不明白可能导致问题的原因。我能够在没有问题的情况下在.Net Web App中嵌入仪表板,因此我不认为问题出在我的Power BI或Azure Directory帐户中。
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));
}
}
答案 0 :(得分:2)
根据您的描述,我假设您正在为Power BI用户(用户拥有数据)方法使用Access令牌。我建议您在成功调用authContext.AcquireTokenAsync
后使用https://jwt.io/解码access_token。确保aud
为https://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是原始帖子。