我已将必要的代码从示例解决方案移至我的解决方案,并且在进行身份验证时出现以下错误:
AADSTS90002:找不到租户授权。如果有可能会发生这种情况 没有租户的有效订阅。检查您的订阅 管理员。
我正在使用以下2行进行身份验证:
var authenticationContext = new AuthenticationContext(AuthorityUrl);
var authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl, ApplicationId, credential);
该错误发生在最后一行。以下是我的web.config中的值:
<add key="authorityUrl" value="https://login.windows.net/common/oauth2/authorize/" />
<add key="resourceUrl" value="https://analysis.windows.net/powerbi/api" />
同样,这在示例应用程序中可以100%起作用,但是当我移至我的应用程序时无效。有什么想法吗?
在此先感谢您的帮助。
答案 0 :(得分:15)
因此,经过一些研究,我发现这与以下nuget软件包的版本有关:
Microsoft.IdentityModel.Clients.ActiveDirectory
Microsoft.PowerBI.Api
需要使用以下版本:
Microsoft.IdentityModel.Clients.ActiveDirectory v3.13.9
Microsoft.PowerBI.Api V2.0.12
似乎与使用的端点有关。如果您降级到上述版本(与提供的示例工具中使用的版本相同),那么它将起作用。
最新版本使用的是这样的内容:https://login.microsoftonline.com/common/
,其中相同提供的版本是:https://login.windows.net/common/oauth2/authorize/
一旦我“降级”了我的版本,它就会通过身份验证!
希望这对其他人有帮助。
答案 1 :(得分:5)
在我的情况下,我将身份验证端点从Microsoft.IdentityModel.Clients.ActiveDirectory
更改为https://login.windows.net/{My tenant}/oauth2/token
,而不是将https://login.microsoftonline.com/{My tenant}
降级了。
答案 2 :(得分:2)
通过将程序集“ Microsoft.IdentityModel.Clients.ActiveDirectory ”还原为Version = 3.13.9.1126来解决。
使用该程序集的最新版本会引发此问题。版本= 4.4.0.0
答案 3 :(得分:2)
是的,所有的答案都是正确的,我只想说明为什么它在低版本而不是新版本中起作用
根据official doc,这是来自Microsoft的更好的权限验证更新
设置ADAL.NET 4.x时,其宽容度也低于ADAL3.x。 AuthenticationContext构造函数中的授权。有效 对于Azure AD v1.0,应具有以下权限:
- https://login.microsoftonline.com/ {Guid},其中Guid是租户ID
- https://login.microsoftonline.com/domainName,其中,域名是与您的租户关联的域
https://login.microsoftonline.com/common,对于ADAL.NET,它表示任何Azure AD租户(请注意,含义是
在MSAL.NET中有所不同)不能为https://login.microsoftonline.com/common/OAuth2/endpoint 即使此错误可能在ADAL 3.x中被错误接受
答案 4 :(得分:0)
修复非常简单,但很难从 Microsoft Docs 中找到,因为它们非常庞大。所以我要分享对我们有用的东西。
请注意,我们使用 AuthenticationContext
结合 ClientCredential
来获取令牌。
3.x
版本的 AuthorityUrl 是 - https://login.windows.net/{yourOrg}/oauth2/token
升级到 4.x
或更高版本后,应更改为 - https://login.microsoftonline.com/{yourOrg}
如果你想知道完整的代码只有 2 行
var authenticationContext = new AuthenticationContext(AppSettings.AuthorityUri);
var token = authenticationContext.AcquireTokenAsync(AppSettings.ResourceUri, new ClientCredential(AppSettings.ClientId, AppSettings.ClientSecret)).GetAwaiter().GetResult();