使用 Azure AD 和本地数据库的 .NET Core 更新权限



我有一个.NET Core WebApp,它通过Azure AD登录用户。用户登录后,我立即获取电子邮件地址并签入我的应用程序数据库,该用户具有哪个角色。

现在的问题是:由于用户可以被锁定(Db IsBlock布尔字段(,我需要能够更新用户的权限。由于用户始终保持登录状态(单点登录(,因此是否需要检查用户对每个请求的权限?意思是:在每个请求中,我都会向数据库查询权限并相应地更新这些权限?

我担心的是这会导致对数据库的大量请求,不是吗? 而且,您可以更新索赔吗?

在我看来,这是您必须选择的性能和安全性的平衡。 我在这里看到至少 3 个选项,每个选项都有其优点和缺点:

  1. 检查每个请求的标志(最高安全性,最低性能(
  2. 仅在登录时检查标志(最低安全性,最高性能(
  3. 混合两者,将上次检查时间
  4. 存储在用户会话中,并在上次检查时间超过 N 分钟时从数据库检查

请注意,当我说"最高安全性"/"最低安全性"时,你确实需要在此处评估你的方案和风险,并且不在每个请求上检查这样的字段实际上不会使你的应用不安全,除非你想要准备的风险包括这种情况。 许多Microsoft自己的应用程序(如 O365 中的应用程序(都依赖于 Azure AD 生成的访问令牌,这些令牌的有效期为一小时。 因此,禁用用户登录后,可能需要一个小时才能取消所有访问权限。

可以在应用端向用户添加声明,但无法修改 Azure AD 发送的令牌(这要归功于它们具有的数字签名(。 但是,即使可以添加声明,仍需要检查数据库以检查标志的更新。

另一种类似于我提到的第三个选项的方法是为前端提供应用生成的令牌(例如 JSON Web 令牌(。 它有一个到期时间,因此前端必须以这些间隔从后端刷新该令牌。 此时,您可以检查阻止状态并拒绝刷新令牌。 通过调整令牌有效期,可以调整用户在被阻止之前可能拥有的最大可用时间。

最新更新