操作返回无效状态代码 'Unauthorized''
Operation returned an invalid status code 'Unauthorized''
我正在尝试按照 here 中的示例项目和教程将示例 Power BI 仪表板嵌入 WPF 应用程序。当我启动该应用程序时,我必须输入我的密码来验证我自己,当它尝试使用 getAppWorkspacesList()
获取我的 Power BI 工作区列表时,我收到此错误消息
Microsoft.Rest.HttpOperationException: 'Operation returned an invalid
status code 'Unauthorized''
有人可以帮忙指出为什么会出现这个错误吗?我试图查看错误的详细信息,但我不明白是什么导致了这个问题。我能够毫无问题地将仪表板嵌入 .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));
}
}
根据您的描述,我假设您使用的是 Power BI 用户访问令牌(用户拥有数据)方法。我建议您在成功调用 authContext.AcquireTokenAsync
后使用 https://jwt.io/ 解码 access_token。确保 aud
是 https://analysis.windows.net/powerbi/api
并检查权限范围 属性 scp
。
对于 Get Groups,所需的范围如下所示:
Required scope: Group.Read.All or Group.ReadWrite.All or Workspace.Read.All or Workspace.ReadWrite.All
您还可以使用 fiddler 或 postman 来模拟针对 get groups 端点的请求,并在您的 WPF 应用程序中收到 access_token 以缩小此问题的范围。
此外,您可以按照 Register an application 检查您的 Azure AD 应用程序并确保对 Power BI 服务 (Microsoft.Azure.AnalysisServices) 的所需委派权限 API 已正确配置。
我们在使用应用拥有数据的方法时遇到了同样的错误。 here 描述了解决该问题的方法。
基本上,Microsoft website does not work. We end up making a REST API call to https://login.microsoftonline.com/common/oauth2/token 和 post 中记录的获取访问令牌的方法如下数据:
- grant_type: 密码
- 范围:openid
- 资源:https://analysis.windows.net/powerbi/api
- client_id: APPLICATION_ID
- client_secret: APPLICATION_SECRET
- 用户名:USER_ID
- 密码:USER_PASSWORD
你会得到一个 JSON 回来,然后你可以获得 access_token ,它将在创建 power bi 客户端时使用,如下所示:
var mTokenCredentials = new TokenCredentials(accessToken, "Bearer");
using (var client = new PowerBIClient(new Uri("https://api.powerbi.com"), mTokenCredentials))
我希望这可以帮助别人。 This原来是post.
我正在尝试按照 here 中的示例项目和教程将示例 Power BI 仪表板嵌入 WPF 应用程序。当我启动该应用程序时,我必须输入我的密码来验证我自己,当它尝试使用 getAppWorkspacesList()
获取我的 Power BI 工作区列表时,我收到此错误消息
Microsoft.Rest.HttpOperationException: 'Operation returned an invalid status code 'Unauthorized''
有人可以帮忙指出为什么会出现这个错误吗?我试图查看错误的详细信息,但我不明白是什么导致了这个问题。我能够毫无问题地将仪表板嵌入 .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));
}
}
根据您的描述,我假设您使用的是 Power BI 用户访问令牌(用户拥有数据)方法。我建议您在成功调用 authContext.AcquireTokenAsync
后使用 https://jwt.io/ 解码 access_token。确保 aud
是 https://analysis.windows.net/powerbi/api
并检查权限范围 属性 scp
。
对于 Get Groups,所需的范围如下所示:
Required scope: Group.Read.All or Group.ReadWrite.All or Workspace.Read.All or Workspace.ReadWrite.All
您还可以使用 fiddler 或 postman 来模拟针对 get groups 端点的请求,并在您的 WPF 应用程序中收到 access_token 以缩小此问题的范围。
此外,您可以按照 Register an application 检查您的 Azure AD 应用程序并确保对 Power BI 服务 (Microsoft.Azure.AnalysisServices) 的所需委派权限 API 已正确配置。
我们在使用应用拥有数据的方法时遇到了同样的错误。 here 描述了解决该问题的方法。
基本上,Microsoft website does not work. We end up making a REST API call to https://login.microsoftonline.com/common/oauth2/token 和 post 中记录的获取访问令牌的方法如下数据:
- grant_type: 密码
- 范围:openid
- 资源:https://analysis.windows.net/powerbi/api
- client_id: APPLICATION_ID
- client_secret: APPLICATION_SECRET
- 用户名:USER_ID
- 密码:USER_PASSWORD
你会得到一个 JSON 回来,然后你可以获得 access_token ,它将在创建 power bi 客户端时使用,如下所示:
var mTokenCredentials = new TokenCredentials(accessToken, "Bearer");
using (var client = new PowerBIClient(new Uri("https://api.powerbi.com"), mTokenCredentials))
我希望这可以帮助别人。 This原来是post.