c# - 如何跨多个 API 管理会话
问题描述
我有一个非常基本的问题,因为我正在观看一些与微服务相关的教程。如果我为 1 个应用程序创建多个微服务,我是否需要为所有微服务实现身份验证和授权?例如,如果我有一个电子商务网站,并且我有多个具有某些端点的微服务用于购买模型。
- 作为用户,当我登录 UI 时,最初调用 AccountManagement 微服务(它几乎没有注册/登录/重置/撤销等功能),然后从一个功能移动到另一个功能,中间调用另一个微服务(下一个微服务是否应该读取 cookie信息并自动进行身份验证?它是这样工作的吗?
- 我的其他微服务是否也具有帐户管理微服务的所有功能或仅通过刷新令牌进行身份验证?
我对微服务中的这个概念相当陌生,并试图通过教程尽可能多地掌握,但这些问题我仍然很难正确理解。
解决方案
答案 1. 基于令牌的身份验证 您始终可以为单体构建有状态的应用程序,但不能为无状态的微服务构建。基于会话的身份验证适用于 Monolith。但是,对于微服务,因为您需要将请求路由到多个独立服务。为了在我们的系统中保持无状态,我们选择使用令牌身份验证。我们在 jwt.xml 中打包了用户声明。因此,我们需要对微服务进行身份验证。您可以应用基于 SSO 的方法。
当用户第一次从任何前端应用程序登录时,会在 api-gateway 上创建一个名为 jwt-token 的 cookie。cookie 的域是 .myorg.com,因此所有 myorg.com 子域都可以访问。当任何前端应用程序向 api 网关发出请求时,我们会提取名为 jwt-token 的 cookie(如果已设置)。如果未设置,我们假设用户未登录并从 api-gateway 返回 401 状态代码。如果您的微服务没有暴露在互联网上,您还可以引入基本身份验证。这也将确保减少公司内部的任何安全风险。
回答 2. 微服务遵循 DDD(域驱动设计)原则,使其独立于小应用程序。您不应添加任何账户管理功能(它是一项独立的服务)。其他服务应该有他们的身份验证以及他们的域,比如客户、支付、审计等。
参考这些文章:
推荐阅读
- php - 如何使用 PHP/MYSQL 从我的项目页面在我的项目详细信息页面中显示一项
- openid - Quarkus 从类路径加载第 3 方属性文件
- python - PySide2 中的 QThread 已启动,但未在启动信号上触发插槽
- python - 根据列名在两列之间删除熊猫数据框中的多列
- javascript - 带有 Webpack 的 Javascript 类附加命名空间
- c++ - 我可以使用模板成员函数作为 CRTP 的替代方法来实现静态多态性吗?
- python - 如果值存在于同一行的任何其他列中,则 Pandas 删除值
- sql - 在 BigQuery 中将两个查询与 case 语句相结合
- r - 如何创建连续变量?
- leaflet - 如何监听 react-leaflet 地图的图层控制事件