Azure AD不显示“用户同意”页面并在登录时返回AADSTS65001,仅适用于某些AD租户

时间:2016-12-23 17:47:45

标签: azure active-directory azure-active-directory adal microsoft-graph

我们有两个不同的无关组织(租户)。还有一个AngularJS网站,想要通过他们的AD帐户登录用户(OAuth,与登录Facebook或Google流程一样),或者从他们的基本个人资料中注册一些预先填写的信息。我们使用adal.js库,没有adal-angular.js。

每个租户都在“应用注册”部分中创建了自己的单租户应用

问题

登录和注册都与第一个租户的应用程序完美配合。用户在login.microsoftonline.com/{tenant-id}登录(为简洁起见,我们称之为“MS页面”),看到“用户同意”页面,接受授予权限,MS页面重定向回我们的网站,网址为id_token,我们的应用程序发送请求对于access_token并成功接收它。

但对于第二个租户的应用,它在登录后尝试获取access_token时会收到 AADSTS65001 #/error=interaction_required&error_description=AADSTS65001:+The+user+or+administrator+has+not+consented+to+use+the+application+with+ID+'ff1bb76e-7823-45a1-9950-b38fe8d3d0b4'.+Send+an+interactive+authorization+request+for+this+user+and+resource.&Trace+ID=...但是“用户同意”页面未显示,并且此前没有错误消息。

所有交互都发生在MS页面上,并且它在两个不同的AD组织/租户中的两个不同应用程序中的工作方式不同,这有点令人困惑。

两个应用中的相同内容:

  • 我们的网站代码在两种情况下都是相同的(除了租户ID和客户端ID ofc),它被部署到同一个网址
  • 两个应用程序的配置是相同的(不能保证,但我们有一个“共享屏幕”调用,我们检查了该清单,我们知道的所有设置和权限都具有相同的值)
  • 这两个应用都是在新Azure门户中从头开始创建的,我们只在清单和回复网址中设置了oauth2AllowImplicitFlow: true,我们没有更改其他设置
  • 这两个应用只有一个必需权限集:Windows Azure Active Directory - “登录并读取用户个人资料”委派权限

我们的adal配置如下:

var adAccessTokenResource: = 'https://graph.windows.net' 
var adalOptions = {
      tenant: tenantId,
      clientId: clientId,
      resource: adAccessTokenResource,
      endpoints: { graphApiUri: adAccessTokenResource },
      //popUp: true // does not work the same way for both true and false
}

不同的事情:

一个可能的区别是我们的网站位于subdomain.{org-name}.com,其中{org-name}与租户工作名称相同,因此用户在其中拥有帐户username@{org-name}.com。这可能是原因吗?

此外,对于第二个租户的某些帐户,login.microsoftonline.com会重定向到特定于组织的页面以登录用户。但对于其他帐户,它没有,并且在两种情况下错误和行为都是相同的。

在使用Fiddler进行调试后,我们发现在两种情况下,MS页面都会发送相同的POST https://login.microsoftonline.com/{tenant-id}/login请求。但对于工作应用程序,它会在“用户同意”页面上返回200响应。如果用户同意 - 发送第二个请求POST /{tenant-id}/Consent/Grant,返回302 id_token并重定向到我们的应用程序,意味着用户已登录。我们的应用程序要求重定向上的访问令牌,此请求有效。

对于非工作应用POST https://login.microsoftonline.com/{tenant-id}/login,立即使用id_token返回302重定向,而不显示“用户同意”页面。因此,我们在第一次请求后获得重定向。我们的应用程序要求访问令牌,并获得未给出同意的错误。

问题

行为差异可能出现什么情况?

或者只应该使用多租户应用?我们希望首先使用单租户应用程序。

我是Azure AD的新手。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

作为一个更新,我们最终做了一些丑陋的黑客,但新的 msal 库(也来自微软,是adal lib的官方替代品),我们的AD登录代码得到了很多更小更好,我们没有问题。

因此,使用msal.js库而不是过时的adal.js一个

答案 1 :(得分:0)

根据ADAL.js with Multi-Tenant Azure Active Directory的答案,AAD的PM表示要为多租户实施adal.js,我们可以将tenant_id设置为common并附加额外参数登录端点中的prompt=admin_consent。我尝试了一个测试代码项目,并且在我这方面运行良好。

请参阅adal.js中的以下配置:

    var configOptions = {
        tenant: "common", // Optional by default, it sends common
        clientId: "<client_id>",
        extraQueryParameter: 'prompt=admin_consent',
        postLogoutRedirectUri: window.location.origin,
    }
    window.authContext = new AuthenticationContext(configOptions);