在 NodeJS 后端使用 JWT 和 Active Directory 身份验证

Posted

技术标签:

【中文标题】在 NodeJS 后端使用 JWT 和 Active Directory 身份验证【英文标题】:Using JWT with Active Directory authentication in NodeJS backend 【发布时间】:2015-08-10 05:49:21 【问题描述】:

我正在构建一个由 Angular 前端和 Node.JS 后端组成的 Intranet Web 应用程序。应用程序需要使用企业 Active Directory 进行身份验证和授权。

我正在考虑如何以安全的方式最好地实现这一点。我计划使用Active Directory node module 与 AD 进行实际通信,以在用户登录时进行身份验证,并检查安全组成员资格以了解某些受限操作等。

但是,我不太确定授权后端端点的最佳方式是什么。 AD 模块不提供任何令牌/票证,即使我认为 Kerberos 用于实际的身份验证过程。在我开发的其他经过身份验证的应用程序中,我在用户登录时生成了一个 jsonwebtoken,然后在每个后端路由中传递并验证了该令牌,在针对 AD 进行身份验证时这也是一个好主意吗?

编辑:问题的第二部分衍生到单独的线程:Best practices for server-side handling of JWT tokens

此外,我还有一个更普遍的担忧,即实际验证令牌的最佳做法是什么。假设用于 JWT 生成的“秘密”被泄露(在我的场景中,很多人可能可以访问系统的源代码,但不能访问系统本身)。我是否相信恶意用户可以仅使用此信息代表任何给定用户生成令牌,而无需通过 AD 进行身份验证,在我的 API 请求中使用该令牌?令牌通常使用jwt.sign(payload, secretOrPrivateKey, options) 生成。 或者,假设恶意用户可以获得一个实际的令牌(在它过期之前)。对我来说,似乎不必知道用户的用户名和密码,安全性现在降低到必须知道用户名和 JWT 密码。这是一个有效的问题吗?我应该怎么做才能防止这种情况发生?

到目前为止,我最大的希望是在登录后使用服务器端会话来存储有关当前用户的信息,这样即使在访问后端端点时恶意生成并使用了令牌,它也会失败,除非用户实际上已经离开通过登录路由,通过 AD 进行身份验证,并因此在会话中存储了一些信息。

我还考虑过在 each API 端点中实际使用 AD 进行身份验证,但这需要在每个请求中发送 AD 用户名/密码,这反过来又需要敏感信息必须是存储在客户端的会话存储或本地存储中,这很可能是个坏主意。

所以,问题:

1) 将 AD 授权与 JWT 结合作为不记名令牌是否合理,或者使用 AD 进行身份验证构建安全后端 + 前端的首选方式是什么?

2) 如果 JWT 是一个好主意,那么使用 JWT 保护端点的最佳实践是什么?使用服务器端会话合理吗?

有趣的是,我发现了大量关于如何最好地实现基于令牌的身份验证的示例(一般来说,或者特别是使用 NodeJS),但其中许多似乎以某种方式存在缺陷。

【问题讨论】:

您能否澄清或扩展问题 2)?您是指保护服务器和后端服务之间的通信,还是一种无需在每个请求中传递 JWT 即可保护客户端-服务器通信的方法? 我猜,我的意思是关于如何安全验证 JWT 令牌以及如何管理服务器机密的一般最佳实践。让我把它变成一个单独的问题:***.com/questions/30523238/… 感谢您的澄清。我会更新我的答案。 【参考方案1】:

1) 将AD授权与JWT结合为承载是否合理 令牌或构建安全后端的首选方法是什么+ 前端使用 AD 进行身份验证?

这是合理的,但如果您已经在使用 Kerberos 和 AD 对用户进行初始身份验证,您可以考虑使用s4u2proxy受约束的委托,它允许服务将用户的服务票证提供给KDC 并获取(根据授权检查)后端服务的票证(并重复所需的服务)。

如果您有很多需要联系的后端服务,则单个 JWT 可能会承载所有服务执行授权策略所需的所有授权声明更好的选择。

2) 如果 JWT 是一个好主意,那么确保安全的最佳实践是什么 使用 JWT 的端点?使用服务器端会话合理吗?

适用一般密钥安全做法:

永远不要在任何地方的非易失性存储中明文存储密钥。 理想情况下,不要将加密密钥存储在服务器上的附加存储中,如果服务器受到攻击,它们将受到离线攻击。仅在服务器启动时使它们对主机可用。 确保密钥材料驻留在安全内存中,以便无法将其交换到磁盘(和/或使用加密交换)。 使用公钥算法,这样多个主机上就不需要存在密钥。 考虑使用hardware security module (HSM)。

【讨论】:

感谢您的信息。我只有一个后端 API 服务,需要使用从 AD/Kerberos 身份验证派生的基于令牌的机制进行保护。我可能会坚持使用 JWT。

以上是关于在 NodeJS 后端使用 JWT 和 Active Directory 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs + reactjs + jwt 检查

IdentityServer4 - AuthorizeAttribute 不验证 JWT 令牌/自定义用户存储

我将前端和后端应用程序上传到 Heroku,但无法使用 jwt()

无法在 nodejs 后端获取令牌

如何使用 JWT 从前端(角度 4)将密钥传递到后端(节点 js)

使用 NodeJS,如何使用 Spring Security OAuth2 制作的 JWT 检索存储在 PostgreSQL 中的会话信息?