我有一个 Azure Active Directory 租户,我希望通过在 Azure 应用服务实例上运行的 Node.js 应用程序对其进行身份验证。我正在使用 passportjs 和 passport-azure-ad 来执行此操作。
本地一切正常。我可以通过 Azure AD 租户进行身份验证,它会正确返回到我的页面。但是在 Azure 上失败并出现以下错误:
authentication failed due to: In collectInfoFromReq: invalid state received in the request
我的配置与我使用相同的租户进行本地测试以及在 Azure 中的配置完全相同(除了 redirectUrl),但它仍然失败。我已经设置了正确的回复 URL,并且身份验证返回到我的应用程序。
这是我的配置:
{
identityMetadata: `https://login.microsoftonline.com/${tenantId}/.well-known/openid-configuration`,
clientID: `${clientId}`,
responseType: 'id_token',
responseMode: 'form_post',
redirectUrl: 'https://localhost:3000/auth/oidc/return',
allowHttpForRedirectUrl: false,
scope: [ 'openid' ],
isB2C: false,
passReqToCallback: true,
loggingLevel: 'info'
}
我正在使用 OIDCStrategy。
我的身份验证中间件:
passport.authenticate('azuread-openidconnect', {
response: res,
failureRedirect: '/auth/error',
customState: '/'
});
我比较了authorize
请求上的编码状态与返回的响应,它们在本地和 Azure 上的不同之处相同,但 Azure 是唯一抱怨的。状态如何不同的示例:
Azure:
Request state: CUSTOMEwAuZcY7VypgbKQlwlUHwyO18lnzaYGt%20
Response state: CUSTOMEwAuZcY7VypgbKQlwlUHwyO18lnzaYGt
localhost:
Request state: CUSTOMTAYOz2pBQt332oKkJDGqRKs_wAo90Pny%2F
Response state: CUSTOMTAYOz2pBQt332oKkJDGqRKs_wAo90Pny/
我也尝试过完全删除 customState 但它仍然失败。
有人知道这里发生了什么吗?我是否配置不正确?
编辑:看来这可能不是护照天蓝色广告的问题。我还不确定,但一些调试显示我的应用程序的登录请求中没有 set-cookie 标头。会话已创建,但未设置 cookie,因此返回的响应无法查找包括状态在内的会话信息并进行比较。结果是它报告无效状态,因为它无法从会话中检索数据。