首页 > 解决方案 > 通过外部 API 进行权限验证

问题描述

给定一个 ASP.NET Core 3.1 webapi 项目,该项目托管一个生成令牌的 IdentityServer;我们还有一个后端微服务集群,前面有一个网关(Ocelot)。网关验证令牌。这纯粹是身份验证,而不是授权。

由于我们是一个多租户应用程序,每个租户可以有多个部门,并将用户分配到部门,具有某些角色/权限等,它可能会变得非常复杂。我们首先尝试在声明中存储用户的所有权限/角色。但这需要我们在声明中列出分配角色的所有权限,这会导致声明过大。

因此,我们正在考虑,在外部验证请求的权限,我们的网关/微服务调用身份服务器上的端点,并验证给定用户是否具有所需的权限。对此有两种(或更多)方法;- 首先,我们正在考虑提供一个端点,该端点公开该用户有权访问的所有角色 + 权限 + 租户 + 部门。如果租户有自己的具有权限的角色,它也会被退回。这将被缓存在调用方(网关)的 Redis 中,以免过于频繁地调用此外部服务(好吧,redis 也是外部的..)。然后,我们可以使用现有的授权策略提供者轻松验证用户的访问权限 - 其次,我们可以编写一个中间件/新的身份验证处理程序,用于给定权限、用户、部门和租户,调用身份服务器 API,它基本上返回 ok 或 not OK。这也可以被缓存。

我唯一有点害怕的是每个 HTTP 请求都会增加延迟,因为突然间你正在调用一个外部服务......然后,如果最好把它放在中间件中,一个自定义身份验证处理程序,. ..

谢谢!

标签: asp.net-corepermissionsidentityserver4

解决方案


关于您的第一种方法,您可以调用UserInfo端点,它是默认的 IdentityServer 端点之一。此端点返回一个 JSON 对象,其中包含有关您的用户的所有信息。此外,通过这种方法,您无需担心令牌的大小。

如果你打算使用 Redis,你可以实现 IProfileService,它是 UserInfo 数据提供者。


推荐阅读