【问题标题】:Invalid state on azure, but working locally天蓝色上的状态无效,但在本地工作
【发布时间】:2018-07-04 18:46:06
【问题描述】:

我有一个 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: '/'
});

我比较了 authorizerequest 上的编码状态与返回的响应,它们在本地和 Azure 上的差异相同,但 Azure 是唯一抱怨的。各州有何不同的示例:

Azure:
Request state:  CUSTOMEwAuZcY7VypgbKQlwlUHwyO18lnzaYGt%20
Response state: CUSTOMEwAuZcY7VypgbKQlwlUHwyO18lnzaYGt

localhost:
Request state:  CUSTOMTAYOz2pBQt332oKkJDGqRKs_wAo90Pny%2F
Response state: CUSTOMTAYOz2pBQt332oKkJDGqRKs_wAo90Pny/

我也尝试过完全删除 customState 但仍然失败。

有人知道这里发生了什么吗?是不是我配置错了?

编辑:看来这可能不是 passport-azure-ad 的问题。我还不确定,但一些调试显示我的应用程序的登录请求中没有 set-cookie 标头。会话已创建,但未设置 cookie,因此返回的响应无法查找包括状态在内的会话信息并进行比较。结果是它报告了无效状态,因为它无法从会话中检索数据。

【问题讨论】:

    标签: node.js adal passport-azure-ad


    【解决方案1】:

    原来问题在于会话从未正确创建,因此process-azure-ad 没有可比较的状态。这样做的原因是我已将express-session 配置为使用安全会话cookie,假设因为我通过https://...azurewebsites.net 地址连接,所以连接是安全的。但从技术上讲,情况并非如此。

    Azure 在 Web 应用程序前面运行负载均衡器,有效地代理从外部到我的应用程序的连接。这个代理是安全连接终止的地方,然后流量以未加密的方式路由到我的应用程序。

    Browser -(HTTPS)> Load balancer -(HTTP)> Application
    

    结果是节点没有报告连接是安全的,除非设置了配置选项trust proxy

    app.set('trust proxy', true);
    

    设置此选项后,express 将检查用于连接代理服务器(在本例中为负载平衡器)的协议的 X-Forwarded-Proto 标头。此标头包含 http 或 https,具体取决于连接协议。

    对于 Azure,虽然这还不够。 Azure 负载均衡器也不设置 X-Forwarded-Proto 标头。相反,它使用x-arr-ssl。这不是一个大问题,因为 iisnode(我用来在 Azure 中的 IIS 上运行节点的运行时)有一个名为 enableXFF 的选项,它将根据连接的外部协议更新 X-Forwarded-Proto 标头。通过设置这两个选项,express-session 可以设置安全 cookie 来保存会话,并允许passport-azure-ad 存储和比较身份验证状态信息。

    PS:非常感谢 Scott Smiths 博客 + cmets 提供的答案: http://scottksmith.com/blog/2014/08/22/using-secure-cookies-in-node-on-azure/

    【讨论】:

      【解决方案2】:

      这是模块passport-azure-ad 的一个已知编码问题。见:

      您可以将模块版本升级到v3.0.7 或更新的版本来修复它。

      【讨论】:

      • 我发现了,但我使用的是 v3.0.9
      猜你喜欢
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多