Azure AD不显示用户同意页,并在登录时返回AADSTS65001,仅适用于某些广告租户
我们有两个不同的不相关的广告组织(租户)。还有一个AngularJS网站,它想通过用户的广告帐户(OAuth,与使用Facebook或Google flow登录相同)登录用户,或者使用用户基本档案中的一些预先填写的信息进行注册。我们使用adal.js库,而不使用adal-angular.js 每个租户都在“应用程序注册”部分创建了自己的单个租户应用程序 问题 登录和注册都与第一个租户的应用程序完美配合。用户登录Azure AD不显示用户同意页,并在登录时返回AADSTS65001,仅适用于某些广告租户,azure,active-directory,azure-active-directory,adal,microsoft-graph-api,Azure,Active Directory,Azure Active Directory,Adal,Microsoft Graph Api,我们有两个不同的不相关的广告组织(租户)。还有一个AngularJS网站,它想通过用户的广告帐户(OAuth,与使用Facebook或Google flow登录相同)登录用户,或者使用用户基本档案中的一些预先填写的信息进行注册。我们使用adal.js库,而不使用adal-angular.js 每个租户都在“应用程序注册”部分创建了自己的单个租户应用程序 问题 登录和注册都与第一个租户的应用程序完美配合。用户登录login.microsoftonline.com/{tenant id}(为了简洁起
login.microsoftonline.com/{tenant id}
(为了简洁起见,我们称之为“MS page”),看到“用户同意”页面,接受授予权限,MS page重定向回我们的网站,url中带有id_令牌,我们的应用程序发送访问_令牌的请求并成功接收
但对于第二个租户的应用程序,它收到的是AADSTS65001:\error=interaction\u required&error\u description=AADSTS65001:+user+或+administrator+已+未+同意+使用+应用程序+带+ID+'ff1bb76e-7823-45a1-9950-b38fe8d3d0b4'。+发送+交互+授权+请求+此+用户+和+资源。&Trace+ID=…
在他们登录后尝试获取访问令牌时但未显示“用户同意”页面,并且在此之前没有错误消息
所有交互都发生在MS页面上,在两个不同的广告组织/租户的两个不同应用程序中工作方式不同,这有点令人困惑
两个应用程序中的内容相同:
- 我们的网站代码在这两种情况下是相同的(除了租户id和客户端id ofc),它被部署到相同的url
- 两个应用程序的配置是相同的(不能保证这一点,但我们有一个“共享屏幕”调用,其中我们检查了清单以及我们知道的所有设置和权限具有相同的值)
- 这两个应用程序都是在新的Azure门户中从头开始创建的,我们只在清单和回复URL中设置了
,没有更改其他设置oauth2AllowImplicitFlow:true
- 两个应用在所需权限中仅设置了一个权限:Windows Azure Active Directory-“登录并读取用户配置文件”委派权限
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 page都发送相同的POSThttps://login.microsoftonline.com/{租户id}/login
请求。但对于正在工作的应用程序,它会在用户同意页面上返回200个响应。如果用户同意-发送第二个请求POST/{tenant id}/approvement/Grant
,返回带有id_令牌的302并重定向到我们的应用程序,这意味着用户已登录。我们的应用程序请求重定向上的访问令牌,此请求有效
对于非工作应用程序POSThttps://login.microsoftonline.com/{tenant id}/login
立即返回带有id_令牌的302重定向,而不显示“用户同意”页面。因此,我们在第一个请求之后得到一个重定向。我们的应用程序请求访问令牌,但收到一个错误,表示未给予同意
问题:
行为差异的可能原因是什么
还是应该只使用多租户应用程序?首先,我们想让它与单租户应用程序一起工作
我是Azure AD的新手。任何帮助都将不胜感激。根据的回答,AAD的PM说,要为多租户实现adal.js
,我们可以将tenant\u id
设置为common
,并在登录端点中附加额外参数prompt=admin\u approve
。我尝试了一个测试代码项目,在我这方面效果很好
请参考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);
var配置选项={
租户:“common”,//默认为可选,发送common
客户ID:“,
extraQueryParameter:'prompt=admin\u approve',
postLogoutRedirectUri:window.location.origin,
}
window.authContext=新的AuthenticationContext(配置选项);
作为一个更新,我们最终通过一些丑陋的黑客手段实现了这一点,但通过新的msal库(同样来自微软,是adal lib的正式替代品),我们的AD登录代码变得更小更好,我们没有问题
因此,请使用library而不是过时的adal.js one谢谢!Hovewer,关于为什么它不能作为两个单一租户应用程序工作的任何信息?AAD的授权应遵循中的一个场景,其工作流程不能同时实现两个不同的应用程序。这是OAuthV1的限制。关于多租户集成,您也可以参考。是的,但它们不是同时实现的。我在代码中更改租户id和客户端id并重新部署它。所以在任何给定的时间只有一个应用程序在使用。如果是这样,这不是一个多租户的情况,很抱歉,我可能无法跟上你,那么你目前的问题是什么?它解决了你的问题吗?我还没有尝试多租户和管理员同意,因为我没有全局管理员帐户,但我会的。我的问题是,AD与第一个租户/客户机id对一起工作,但当我用第二个租户对替换它们时,它不会工作(细节在问题中)