用户或管理员未同意使用该应用程序 – 发送此用户和资源的交互式授权请求

我们正在做这个 CRM Web API项目。 该项目登录到Dynamics CRM在线实例并获取帐户列表。

登录似乎正在发生。 但是,帐户列表会出现以下错误:

AADSTS65001:用户或管理员未同意使用ID为“xxxx-xxxxx-xxxx-xxx”的应用程序。 发送此用户和资源的交互式授权请求。 跟踪ID:e3b360d6-39fb-4e61-87d9-26531f30fd7b相关ID:9b2cff0c-074e-44fe-a169-77c8061a7312时间戳:2016-10-18 10:12:49Z

权限已正确设置 :

Azure权限

问题是什么?

管理员必须同意权限。 您应该向Azure AD发出包含参数prompt=admin_consent的授权请求。

与此处的文档一样,prompt参数可以包含3个值:login,consent或admin_consent。

因此,您应该访问https://login.microsoftonline.com/tenant-id/oauth2/authorize?client_id=app-client-id&redirect_uri=encoded-reply-url&response_type=code&prompt=admin_consent等url 。

tenant-id替换为您的Azure AD租户ID /域名,或者如果您的应用是多租户,则将其替换 common 。 将app-client-id替换为您应用的客户端ID。 将encoded-reply-url替换为您应用的url编码回复url。

构建所需URL的一种更简单的方法是进行身份validation,只需在访问Azure AD时获取地址栏中的URL即可。 然后只需将&prompt=admin_consent添加到URL即可。

编辑:随着Azure门户的最新更新,能够直接从门户网站授予权限。

如果您转到新门户中的Azure Active Directory,请在那里找到您的应用注册,然后单击所需权限刀片下的授予权限

新的授予权限按钮

我在使用ADAL的本机应用程序中收到此错误。 我已经给出了所有正确的权限,但已经收到了之前登录的令牌。 我的问题是前一个令牌已过时且未包含更新的声明。 对我来说,解决方案是按照下面的代码使用PromptBehavior.RefreshSession。

  AuthenticationResult result = await authenticationContext.AcquireTokenAsync(resourceId, clientId, redirectURI, new PlatformParameters(PromptBehavior.RefreshSession, false)); 

根据MSDN ,PromptBehavior.RefreshSession“重新授权(通过显示webview)资源使用情况,确保生成的访问令牌包含更新的声明。如果用户登录cookie可用,将不再要求用户提供凭据和登录对话框将自动解除。“

对我来说,这个错误突然发生,对于少数用户来说也是如此。

我的设置是,SPA应用尝试访问API。 我从SPA应用注册中删除了API权限并再次添加。 有效。

授予所有权限。 你会发现多个下拉菜单(就像你在屏幕截图中显示的那个)。

每个下拉项都有多个复选框,引用不同的凭据。 检查每一个,你就是好的。