在NodeJS后端使用JWT和Active Directoryauthentication

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

我正在考虑如何以一种安全的方式最好地实现这一点。 我计划使用Active Directory节点模块实际与AD通信,以便在用户login时进行身份validation,并检查某些受限操作的安全组成员身份等。

但是,我不太确定授权我的后端端点的最佳方式是什么。 AD模块不提供任何令牌/票证,即使我假设Kerberos用于实际的身份validation过程。 在我开发的其他已validation的应用程序中,当用户login时,我生成了一个jsonwebtoken,然后在每个后端path中传递并validation该标记,在对AD进行身份validation时也是一个好主意?

编辑:问题的第二部分催生单独的线程: JWT令牌的服务器端处理的最佳做法

另外,对于实际validation令牌的最佳实践,我有一个更为普遍的关注。 假设用于JWT生成的“秘密”被破坏(在我的场景中,许多人可能有权访问系统的源代码,但不能访问系统本身)。 我是否相信恶意用户可以只用这些信息代表任何给定的用户生成一个令牌,而不用ADvalidation在我的API请求中使用该令牌? 令牌通常使用jwt.sign(payload, secretOrPrivateKey, options)生成jwt.sign(payload, secretOrPrivateKey, options) 。 或者,假设恶意用户可以获得一个实际的令牌(在过期之前)。 对我来说,似乎不必知道用户的用户名和密码,现在安全性已经降低到必须知道用户名和JWT秘密。 这是一个有效的关注,我该怎么做才能防止这种情况?

到目前为止,我最大的希望是使用服务器端会话login后存储有关当前用户的信息,以便即使在访问后端端点时恶意生成并使用令牌,除非用户实际已经通过login路由,通过ADauthentication,并在会话中存储一些信息。

我还考虑过在每个 API端点中实际使用AD进行身份validation,但这需要在每个请求中发送AD用户名/密码,这又要求敏感信息必须存储在客户端的sessionstorage或localstorage中,最有可能是一个坏主意。

所以,问题:

1)将AD授权与JWT结合为不记名令牌是合理的,还是使用AD进行authenticationbuild立安全后端+前端的首选方式是什么?

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

有趣的是,我已经发现了很多关于如何最好地实现基于令牌的authentication的例子(一般来说,或者特别是用NodeJS),但是其中有许多似乎有这样或那样的缺陷。

1)将AD授权与JWT结合为不记名令牌是合理的,还是使用AD进行authenticationbuild立安全后端+前端的首选方式是什么?

这是合理的,但是如果您已经在使用Kerberos和AD对用户进行初始身份validation,则可以考虑使用s4u2proxy 约束委派 ,该委派允许服务向KDC提供用户的服务票据并获取(需要授权检查)后端服务(并重复尽可能多的服务是必要的)。

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

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

一般的关键安全措施适用:

  • 切勿将密钥存储在任何位置的非易失性存储器中。
  • 理想情况下,不要将encryption密钥存储在服务器上的连接存储器中,如果服务器受到威胁,则会受到离线攻击。 只有在服务器启动时才能让主机使用它们。
  • 确保密钥材料驻留在安全的内存中,以便它不能交换到磁盘(和/或使用encryption交换)。
  • 使用公钥algorithm,使多个主机上不需要密钥。
  • 考虑使用硬件安全模块 (HSM)。