面向服务架构中的集中式身份验证

Posted

技术标签:

【中文标题】面向服务架构中的集中式身份验证【英文标题】:Centralized auth in service oriented architecture 【发布时间】:2013-04-21 21:53:22 【问题描述】:

我正在探索基本的面向服务的架构,我想知道如何在整个服务中最好地处理用户身份验证。

作为一个非常简单的示例,假设我们有一个调用其他两个服务的博客应用程序:

    用于存储用户数据和交换凭据以获取访问令牌的用户/身份验证服务 用于管理帖子数据的帖子服务

假设应用程序的用户正在尝试删除特定帖子,并且只有具有“管理员”角色的用户才能这样做。

需要提出以下请求:

应用程序 -> 身份验证

验证当前用户(通过某种令牌)。如果令牌过期,应用程序可以将用户重定向到登录表单等。

应用 -> 帖子

删除帖子。

帖子 -> 授权

在删除帖子之前,帖子服务需要确保发出请求的用户有权这样做。验证当前用户(通过令牌)并确保他们具有“管理员”角色。

这是一个过于简单的示例,但我很好奇人们是如何在整个服务中处理身份验证的。似乎每个服务都需要单独调用身份验证服务才能授权请求。是这样吗?在这种 SOA 中是否有更好的方法来处理身份验证?

谢谢!

【问题讨论】:

【参考方案1】:

您可以实现identity provider - 一旦用户通过授权/身份验证服务进行身份验证,她应该获得一个标识她的令牌。该令牌可以识别她(角色/声明)并由身份验证/授权服务私钥签名。当服务获得安全令牌并由受信任的机构签名时,它不需要再次访问身份验证/授权服务。

如果您的系统有更高的安全要求(例如在用户级别),您可能需要详细声明或访问每个请求的授权系统。我曾经在一个系统上工作过,其中某些类型的信息在每次访问时都需要授权,而其他类型的信息对于基于角色的安全性来说是可以的 - 你的能力可能会有所不同。

【讨论】:

您是否建议令牌本身包含用户的角色? 这完全取决于您的安全要求。如果在令牌生命周期内您可以不处理授权撤销,那么您可以使用它。在您负担不起的情况下,您需要对每个请求进行授权。请注意,如果身份提供者和使用它的服务部署在同一台服务器上,则开销可能是合理的。例如OpenAM 中的策略代理wikis.forgerock.org/confluence/display/openam/… @Michael 而不是什么? OpenID 用于身份验证,问题是关于授权。此外,OpenAM 只是一个示例,还有其他方法和技术

以上是关于面向服务架构中的集中式身份验证的主要内容,如果未能解决你的问题,请参考以下文章

为用户提供集中式身份验证服务器或每个微服务一个数据库?

如何使用 Azure API 管理设计微服务架构中的身份验证和授权策略?

在 NodeJS/Express 中使用 API 网关进行微服务 API 身份验证

用户和身份验证的分布式数据库设计架构用例

如何在微服务架构中进行身份验证和授权

在微服务架构中组织用户和身份验证