我们有两个不同的无关组织(租户)。还有一个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组织/租户中的两个不同应用程序中的工作方式不同,这有点令人困惑。
两个应用中的相同内容:
oauth2AllowImplicitFlow: true
,我们没有更改其他设置我们的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的新手。任何帮助将不胜感激。
答案 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);