如何在 API 和微服务之间传递用户上下文?

How does one pass user context between an API and a microservice?

我正在尝试设置审核日志记录,我们希望日志事件的发生尽可能接近操作,同时也知道哪个用户执行了该操作。这意味着我们需要输入用户信息。这方面的最佳做法是什么?

我假设您正在开发一个 public 面向互联网的应用程序,您的微服务是使用 ASP.Net 核心构建的,基于此我建议如下:

设置 SF 时,让它创建两个规模集,一个用于面向 public 的微服务("API Facade" 和 GUI),另一个用于内部微服务。 最好将 "internet facing code" 与 "internal code" 分开。

让 Identity Server 为您的 public "Facade API" 颁发包含客户信息的访问令牌,并在调用您的 API.

时使用它

您的 API 外观服务将充当您所有内部微服务的代理并卸载 SSL/Authentication,因此您不必处理这个内部问题。这也是我建议您进行实际审计日志记录的地方。在您的 Facade API 中,创建一个关联 ID 并将其作为 header 添加到对内部服务进行的任何调用中。将关联 ID 添加到任何正在生成的日志记录中。这将允许您在整个系统中一直跟踪 API 调用,连同您的审核日志,您可以准确地看到用户一直在做什么。

对于审计,我可以推荐Audit.Net。有了这个,你可以像这样向你的控制器添加一个属性:

namespace MyWebApi.MyService.Controllers
{
  [Route("api/[controller]")]
  [AuditApi(EventTypeName = "{controller}/{action} ({verb})")]
  public class MyController : Controller
  {
  }
}

它会自动为您处理审核。您可以将其配置为记录 blob storgate、文件或其他任何内容。

(我与Audit.Net没有任何关系,我只是喜欢它。)

您可以通过连接到 Service Fabric 中的底层通信来进行设置。请查看 以了解结构传输消息调度的说明以及如何连接到它以记录和审核服务的通信和使用情况。