Node.js 在NodeJS后端使用JWT和Active Directory身份验证
我正在构建一个intranet web应用程序,它由一个Angular前端和一个Node.JS后端组成。应用程序需要使用公司Active Directory进行身份验证和授权 我正在考虑如何以安全的方式最好地实现这一点。我计划使用与AD进行实际通信,以在用户登录时进行身份验证,并检查安全组成员资格以执行某些受限操作,等等 但是,我不太确定授权后端端点的最佳方式是什么。AD模块不提供任何令牌/票据,即使我认为Kerberos用于实际的身份验证过程。在我开发的其他经过身份验证的应用程序中,我在用户登录时生成了一个jsonwebtoken,然后在每个后端路由中传递并验证该令牌,这在针对AD进行身份验证时也是一个好主意吗 编辑:问题的第二部分衍生到单独的线程: 另外,我还有一个更普遍的担忧,关于实际验证令牌的最佳实践是什么。假设JWT生成所使用的“秘密”受到了损害(在我的场景中,许多人可能可以访问系统的源代码,但不能访问系统本身)。我是否正确地认为,恶意用户可以仅使用此信息代表任何给定用户生成令牌,而无需使用AD进行身份验证,就可以在我的API请求中使用该令牌?令牌通常使用Node.js 在NodeJS后端使用JWT和Active Directory身份验证,node.js,security,authentication,active-directory,jwt,Node.js,Security,Authentication,Active Directory,Jwt,我正在构建一个intranet web应用程序,它由一个Angular前端和一个Node.JS后端组成。应用程序需要使用公司Active Directory进行身份验证和授权 我正在考虑如何以安全的方式最好地实现这一点。我计划使用与AD进行实际通信,以在用户登录时进行身份验证,并检查安全组成员资格以执行某些受限操作,等等 但是,我不太确定授权后端端点的最佳方式是什么。AD模块不提供任何令牌/票据,即使我认为Kerberos用于实际的身份验证过程。在我开发的其他经过身份验证的应用程序中,我在用户登
jwt.sign(有效负载、secretroprivateKey、选项)
生成。
或者,假设恶意用户可以获得实际令牌(在其过期之前)。对我来说,似乎不必知道用户的用户名和密码,安全性现在降低到必须知道用户名和JWT秘密。这是一个合理的担忧吗?我应该做些什么来防止这种情况
到目前为止,我最大的希望是在登录后使用服务器端会话来存储有关当前用户的信息,这样即使在访问后端端点时恶意生成并使用令牌,它也会失败,除非用户实际通过了登录路径,使用AD进行身份验证,并因此在会话中存储了一些信息
我还考虑在每个API端点中实际使用AD进行身份验证,但这需要在每个请求中发送AD用户名/密码,这反过来又需要将敏感信息存储在客户端的会话存储或本地存储中,这很可能是个坏主意
因此,问题是:
1) 将AD授权与JWT作为承载令牌相结合是否合理,或者使用AD进行身份验证构建安全后端+前端的首选方法是什么
2) 如果JWT是一个好主意,那么使用JWT保护端点的最佳实践是什么?使用服务器端会话合理吗
有趣的是,我已经找到了大量关于如何最好地实现基于令牌的身份验证的示例(一般来说,或者特别是使用NodeJS),但其中许多示例似乎在某种程度上存在缺陷
1) 将广告授权与JWT作为载体相结合是否合理
令牌或构建安全后端的首选方法是什么+
前端使用AD进行身份验证
这是合理的,但是如果您已经使用Kerberos和Ad来对用户进行初始身份验证,那么您可以考虑使用约束委托,它允许服务将用户的服务票呈现给KDC并获取(受授权检查)后端服务的票(并重复必要的服务)。
如果您有很多后端服务需要联系,那么一个JWT承载所有服务所需的所有授权声明以强制执行授权策略可能是更好的选择 2) 如果JWT是一个好主意,那么保护安全的最佳实践是什么 使用JWT的端点?使用服务器端会话合理吗 一般关键安全实践适用于:- 切勿将钥匙存放在非易失性存储器中的clear中的任何位置
- 理想情况下,不要将加密密钥存储在服务器上的连接存储中,如果服务器受损,它们将受到脱机攻击。使它们仅在服务器启动时对主机可用
- 确保密钥材料驻留在安全内存中,以便无法将其交换到磁盘(和/或使用加密交换)
- 使用公钥算法,以便在多台主机上不需要密钥
- 考虑使用HSM