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

2024-01-03

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

我正在考虑如何以安全的方式最好地实现这一点。我打算使用Active Directory 节点模块 https://www.npmjs.com/package/activedirectory用于与 AD 实际通信以在用户登录时进行身份验证,并检查安全组成员资格以执行某些受限操作等。

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

编辑:问题的第二部分产生到单独的线程:服务器端处理 JWT 令牌的最佳实践 https://stackoverflow.com/questions/30523238/best-practices-for-server-side-handling-of-jwt-tokens

另外,我还有一个更普遍的担忧,即实际验证令牌的最佳实践是什么。假设用于 JWT 生成的“秘密”被泄露(在我的场景中,许多人可能有权访问系统的源代码,但不能访问系统本身)。我是否正确地相信,恶意用户仅使用此信息就可以代表任何给定用户生成令牌,并且无需使用 AD 进行身份验证,就可以在我的 API 请求中使用该令牌?令牌通常使用以下方式生成jwt.sign(payload, secretOrPrivateKey, options)。 或者,假设恶意用户可以获取实际令牌(在其过期之前)。对我来说,安全性现在似乎不再需要知道用户的用户名和密码,而是必须知道用户名和 JWT 秘密。这是一个合理的担忧吗?我应该采取什么措施来防止这种情况发生?

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

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

那么,问题:

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

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

有趣的是,我发现了大量关于如何最好地实现基于令牌的身份验证(一般情况下,或具体使用 NodeJS)的示例,但其中许多示例似乎都存在这样或那样的缺陷。


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

这是合理的,但如果您已经使用 Kerberos 和 AD 来初始验证用户身份,您可能会考虑使用s4u2代理 http://k5wiki.kerberos.org/wiki/Projects/Services4User 受限授权它允许服务向 KDC 提供用户的服务票证并获取(根据授权检查)后端服务的票证(并针对需要的服务重复此操作)。

如果你有a lot需要联系的后端服务,单个 JWT 承载所需的所有授权声明all执行授权策略的服务可能是更好的选择。

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

一般关键安全实践适用:

  • Never将密钥以明文形式存储在任何地方的非易失性存储中。
  • 理想情况下,不要将加密密钥存储在服务器上的附加存储中,因为如果服务器受到威胁,它们将受到离线攻击。使它们仅在服务器启动时可供主机使用。
  • 确保密钥材料驻留在安全内存中,以便无法将其交换到磁盘(和/或使用加密交换)。
  • 使用公钥算法,以便多个主机上不需要存在秘密密钥。
  • 考虑使用硬件安全模块 http://en.wikipedia.org/wiki/Hardware_security_module (HSM).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 NodeJS 后端使用 JWT 和 Active Directory 身份验证 的相关文章

随机推荐

  • MVC 在回发时选择带有模型的列表,如何?

    我正在尝试使用 MVC 3 创建一个需要 2 个下拉列表的视图 在我唯一的其他 MVC 应用程序中 我们使用 Telerik 控件 该控件使用 Ajax 方法来填充数据 现在在这个项目中我们不使用第三方控件 所以我将使用 MVCSelect
  • 在 AngularJS 动态电子邮件验证元素中,当我填写电子邮件检查元素时,它会被重置

    这是 Angular JS 中的电子邮件检查元素代码几乎没问题 但这有一个问题 当我填写电子邮件检查元素时 它被重置 例子 我将其写入电子邮件检查元素 电子邮件受保护 cdn cgi l email protection 但这是重置 当我写
  • Symfony2加载条件配置

    我刚刚开始使用 Symfony2 所以我还是个菜鸟 我需要根据请求 uri 或特定路由加载配置文件 yml E G dynamicroute 应该加载dynamicroute yml and anotherdynamicroute 应该加载
  • 如何恢复中断的下载

    我正在尝试从我的 Yahoo 下载一个大文件 网站服务器显然是设置的 不是我设置的 如果下载未在 100 秒内完成 则会断开下载 文件足够小 通常可以成功传输 当数据速率较慢且下载断开时 是否有办法在发生断开的文件偏移处恢复 URLConn
  • 识别导致回发的控制

    我有一个在下拉列表选择上回发的页面 使用 AJAX 更新面板 根据下拉选择 页面上的其余 UI 是动态生成的 动态 UI 在页面加载时绘制 用于获取值Submit按钮点击 我面临的问题是 在下拉列表更改时 似乎会发生两次回发 一个绘制原始
  • 根据 pandas 数据框中的其他分类值填充分类值的缺失值

    我想用另一个类别中最常见的值填充 Pandas 数据框中分类值的缺失值 例如 import pandas as pd import numpy as np data type softdrink juice softdrink softdr
  • 使 p:calendar 只读

    我要实现
  • 选择所有数据包括另一个表,即使为空

    设置 1 员工表 employeeID firstName lastName 1 鞋子表 shouldD Employee员工ID shoeName shoeColor shoe Brand 我想选择 Employee 表中的所有行 即使鞋
  • R 中用于超大型数据集处理和机器学习的推荐包 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 看起来 R 确实是为处理可以完全拉入内存的数据集而设计的 建议使用哪些 R 包来对无法拉入内存的超大型数
  • java 扫描仪仅读取前 2048 个字节

    我使用 java util Scanner 使用以下代码从类路径读取文件内容 String path1 getClass getResource myfile html getFile System out println new File
  • Delphi 和单元中的最终确定

    我有两个单位unitS和unit 类 TFoo 在单元中声明 在完成unitS时调用B Free总是安全的吗 它如何取决于 dpr 中的unitS和unit的顺序 当执行unitA终结时 我可以确定unitB存在吗 unit unitB i
  • 构造函数中的对象参数

    首先 如果我的问题难以理解 我深表歉意 我很难准确地解释我需要帮助的内容 我对 Java 和按引用传递等概念很陌生 基本上 我需要知道为什么下面的代码不正确 如何告诉 Java 使用作为构造函数参数传入的对象的方法 再次致歉 感谢您的阅读
  • .net 异常捕获块

    以下 catch 块有什么区别 try catch and try catch Exception 我意识到 在任何一种情况下 异常实例都不可用 但是我可以用一个实例做一些其他实例做不到的事情吗 他们是almost相同 来自 C 语言规范
  • 如何在 Xcode 4.3 下用 Objective C 制作 9*9 网格视图?

    i have searched Xcode controls but doesn t found anything that makes a GridView like the one in the lecture below so how
  • 如何在 C# 中从二维数组中获取完整的行或列

    我不想使用锯齿状数组 并且我有一个二维数组 并且我想获得完整的列或行而不循环遍历它 有谁知道如何做到这一点 1 2 3 4 5 6 double array new double 2 3 Out 1 2 3 or 2 5 要从多维数组中获取
  • 验证 int 和 float64 的 Reflect.Type 的其他方法

    在golang中 JSON消息中的数字总是被解析为float64 为了检测它是否实际上是整数 我使用reflect TypeOf 检查其类型 不幸的是没有常数代表reflect Type intType reflect TypeOf 0 f
  • 将 DateTimeOffset 转换为 DateTime 并向该 DateTime 添加偏移量

    I have 日期时间偏移量 DateTimeOffset myDTO DateTimeOffset ParseExact 2015 01 15 17 37 00 0500 yyyy MM dd HH mm ss zzz CultureIn
  • 从头开始重新开发应用程序?

    这不是一个编程问题 但我觉得 SO 是放置它的正确位置 市场上有一个安卓应用程序 我们的工作是大幅升级应用程序 有太多需要改变的地方 以至于我们决定从头开始一个新项目 我的问题是 为了能够替换 升级 Play 商店中现有的应用程序 我们应该
  • 解码引用的可打印正确

    我有以下字符串 utf 8 Q 5Bproconact 2D Verbesserung 23 32 37 39 5D 28Neu 29 Stellvertretungen Benutzerrecht 2D andere k C3 B6nne
  • 在 NodeJS 后端使用 JWT 和 Active Directory 身份验证

    我正在构建一个由 Angular 前端和 Node JS 后端组成的 Intranet Web 应用程序 应用程序需要使用企业Active Directory 进行身份验证和授权 我正在考虑如何以安全的方式最好地实现这一点 我打算使用Act