【发布时间】:2020-10-28 07:59:22
【问题描述】:
我对如何使用具有身份验证和授权的集中式 IDP 感到非常困惑。我的项目的架构是一个单一的 Web API 和一个 React 客户端。我想将事物结构化到微服务中,只是为了尝试更现代的东西,但我在集中式身份方面遇到了重大问题,就像许多其他人一样。
我的目标相当简单。用户登录,从他们有权访问的租户列表中选择一个租户,然后将他们重定向到具有角色和“tid”或租户 ID 声明的客户端,这只是所选公司的 GUID。
Microsoft 规定的在我的场景中添加身份的方法是 IdentityServer,所以我从它开始。一切都很顺利,直到我发现了代币的内部运作。虽然其他一些人在添加权限时遇到问题,但我的应用程序中的授权逻辑非常简单,角色就足够了。虽然我最初可以通过到期自然刷新角色,但每当我的用户选择不同的租户“登录”到时,它们必须立即更新。但是,问题是当用户更改租户而不注销时,我无法刷新这些声明。本质上,我尝试将授权与身份验证混合使用,结果碰壁了。
看来我有两个选择:
- 从单独的提供者,甚至身份服务器本身的端点获取授权信息,例如 /user-info,但用于授权信息。这最终会增加巨大的开销,但服务器和客户端的实际样板是最小的。这和 OSS 版 PolicyServer 的做法类似,虽然我不知道他们的付费实现如何。我的主要问题是客户端和资源(API)都需要这些信息。如何避免每次交互 N 个请求(其中 N 是资源/客户端的数量)?
- 实现某种自定义状态并保留需要刷新 JWT 的用户存储。检查这些并向调用者返回一些自定义响应,然后调用者使用自定义 js 客户端代码刷新此响应上的令牌。这是一个巨大的理论,即使它是合理的,仍然会引入状态,并且在需要大量自定义代码的同时使 JWT 的观点无效。
所以,我为这篇长文道歉,但这真的让我很恼火。我不需要使用 IdentityServer 或 JWT,但我希望至少有一个 React 前端。对于最新的租户选择和角色,我有哪些选择?就在我愿意让步并实现一个返回新数据的授权端点时,我意识到我会在 API 和客户端 每个 请求中调用它。即使有缓存的数据,这在纯 http 调用中也是很多开销。是否有一些替代解决方案可以在这里工作?老实说,我是否可以只使用具有安全且仅在必要时更新的授权信息的 cookie?
【问题讨论】:
标签: asp.net-core jwt authorization identityserver4 identity