asp.net-core - 通过外部 API 进行权限验证
问题描述
给定一个 ASP.NET Core 3.1 webapi 项目,该项目托管一个生成令牌的 IdentityServer;我们还有一个后端微服务集群,前面有一个网关(Ocelot)。网关验证令牌。这纯粹是身份验证,而不是授权。
由于我们是一个多租户应用程序,每个租户可以有多个部门,并将用户分配到部门,具有某些角色/权限等,它可能会变得非常复杂。我们首先尝试在声明中存储用户的所有权限/角色。但这需要我们在声明中列出分配角色的所有权限,这会导致声明过大。
因此,我们正在考虑,在外部验证请求的权限,我们的网关/微服务调用身份服务器上的端点,并验证给定用户是否具有所需的权限。对此有两种(或更多)方法;- 首先,我们正在考虑提供一个端点,该端点公开该用户有权访问的所有角色 + 权限 + 租户 + 部门。如果租户有自己的具有权限的角色,它也会被退回。这将被缓存在调用方(网关)的 Redis 中,以免过于频繁地调用此外部服务(好吧,redis 也是外部的..)。然后,我们可以使用现有的授权策略提供者轻松验证用户的访问权限 - 其次,我们可以编写一个中间件/新的身份验证处理程序,用于给定权限、用户、部门和租户,调用身份服务器 API,它基本上返回 ok 或 not OK。这也可以被缓存。
我唯一有点害怕的是每个 HTTP 请求都会增加延迟,因为突然间你正在调用一个外部服务......然后,如果最好把它放在中间件中,一个自定义身份验证处理程序,. ..
谢谢!
解决方案
关于您的第一种方法,您可以调用UserInfo端点,它是默认的 IdentityServer 端点之一。此端点返回一个 JSON 对象,其中包含有关您的用户的所有信息。此外,通过这种方法,您无需担心令牌的大小。
如果你打算使用 Redis,你可以实现 IProfileService,它是 UserInfo 数据提供者。
推荐阅读
- java - “文本字段验证无法正常工作”
- excel - 基于填充颜色和字体颜色的 VBA 格式单元格
- windows - 如何编写一个函数来阻止或防火墙阻止访问 Windows 中具有多个 IP 地址的网站的流量?
- sql - 基于分隔符的分区字符串
- python - 使用条件表达式提取行 - Pandas Python
- r - 是否有以圆形之字形方式定位标签以实现圆形条形图以清晰可见的功能?
- laravel - 如何在分页范围之外循环遍历整个数据
- php - 破坏 CSS - 当从本地上传 wordpress 到主机时(.htaccess 里面有什么)
- django - 如何根据我的设计在 django 模型中为 postgresql 数据库创建关系
- apache-spark - 如何提高我的 spark 工作的性能以将数据加载到 cassandra 表中?