【问题标题】:How to manage session across multiple APIs如何跨多个 API 管理会话
【发布时间】:2021-08-05 05:57:46
【问题描述】:

我有一个非常基本的问题,因为我正在观看一些与微服务相关的教程。如果我为 1 个应用程序创建多个微服务,我是否需要为所有微服务实现身份验证和授权?例如,如果我有一个电子商务网站,并且我有多个具有特定端点的购买模型的微服务。

  1. 作为用户,当我登录 UI 时,最初调用 AccountManagement 微服务(它几乎没有注册/登录/重置/撤销等功能),然后从一个功能移动到另一个功能,中间调用另一个微服务(应该下一个微服务读取cookie信息并自动认证?是这样的吗?
  2. 我的其他微服务是否也具有帐户管理微服务的所有功能或仅通过刷新令牌进行身份验证?

我对微服务中的这个概念相当陌生,并试图通过教程尽可能多地掌握,但这些问题我仍然很难正确理解。

【问题讨论】:

  • 我建议看看 OAuth 或单签名如何工作。它会回答你的问题。
  • 如果您的微服务是任何人都可以访问的 URL,那么是的,它应该始终受到保护。在C#中,一旦你设置了授权,你只需要用[Authorize]docs.microsoft.com/en-us/dotnet/architecture/microservices/…装饰你的方法你不必担心cookie等。
  • 解耦你的身份验证服务,你的身份验证服务将根据一些散列算法生成访问和刷新令牌,如HS256 存储秘密以进行散列。现在在每个微服务的ConfigureServices() 方法中,使用.AddJwtBearer 扩展方法使用TokenValidationParameters 验证访问令牌,并使用Authorize 属性装饰微服务中的每个方法。

标签: c# .net api asp.net-core microservices


【解决方案1】:

回答 1。 基于令牌的身份验证 为单体构建有状态的应用程序总是可以的,但对于无状态的微服务则不行。基于会话的身份验证适用于 Monolith。但是,对于微服务,因为您需要将请求路由到多个独立服务。为了在我们的系统中保持无状态,我们选择使用令牌身份验证。我们在 jwt.xml 中打包了用户声明。因此,我们需要对微服务进行身份验证。 您可以应用基于 SSO 的方法。

当用户第一次从任何前端应用程序登录时,会在 api-gateway 上创建一个名为 jwt-token 的 cookie。 cookie 的域是 .myorg.com,因此所有 myorg.com 子域都可以访问。当任何前端应用程序向 api 网关发出请求时,我们会提取名为 jwt-token 的 cookie(如果已设置)。如果未设置,我们假设用户未登录并从 api-gateway 返回 401 状态代码。 如果您的微服务没有暴露在互联网上,您还可以引入基本身份验证。这也将确保减少公司内部的任何安全风险。

回答 2。 微服务遵循 DDD(域驱动设计)原则,使其独立于小型应用程序。您不应添加任何账户管理功能(它是一项独立的服务)。其他服务应该有他们的身份验证以及他们的域,比如客户、支付、审计等。

参考这些文章:

  1. https://medium.com/technology-learning/how-we-solved-authentication-and-authorization-in-our-microservice-architecture-994539d1b6e6
  2. https://medium.com/walmartglobaltech/building-domain-driven-microservices-af688aa1b1b8

【讨论】:

  • 谢谢你,这个解释很清楚,你分享的文章清除了我所有的疑惑。
猜你喜欢
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 2017-11-22
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多