【问题标题】:Validate user id with Ocelot API gateway使用 Ocelot API 网关验证用户 ID
【发布时间】:2022-01-18 15:13:08
【问题描述】:

我正在实现一些与单体通信的微服务,所有这些都是使用 .net 核心完成的。 目前,我的网关根据其结构验证用户 jwt 令牌是否有效,但问题是,我需要将用户 ID(来自单体应用程序)传递给微服务,并且我被告知需要对其进行验证. 因此,考虑到这一点,我应该采用什么方法来验证传递给微服务的用户 ID 是否存在?

提前致谢

【问题讨论】:

    标签: .net-core api-gateway ocelot


    【解决方案1】:

    首先,IMO jwt 令牌应该由受信任方创建,并且它包含的任何内容都应该已经有效,因此如果用户一开始不存在,则 IdentityProvider 不应提供 jwt 令牌。

    但如果您必须这样做,您可以为该场景创建一个自定义中间件,从请求中读取令牌并验证用户 ID 是否存在。

    您可以阅读有关自定义中间件的更多信息here

    您的中间件可能如下所示:

    public class UserIdValidatprMiddleware
    {
        private readonly RequestDelegate _next;
    
        public RequestCultureMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        public async Task InvokeAsync(HttpContext context, IIdentityService identityService, IUserStore userStore)
        {
            var userId = identityService.GetUserIdFromToken();
            var userExists = await userStore.CheckIfUserExists(userId);
            if (!userExists) throw SomeException();
            await _next(context);
        }
    }
    

    【讨论】:

    • 那你建议我的网关有一个中间件请求用户所在的数据库,检查该 id 是否存在?
    • 如果网关是一个单独的微服务,那么数据库调用应该在负责用户处理的服务中实现,并且应该发布,例如作为端点。然后,您应该在中间件中向该端点创建一个 http 请求,而不是数据库调用。
    • 我在回答中将 IDatabase 服务重命名为 IUserStore,因此它并不意味着数据库调用
    • 感谢您的回复,这真的很澄清,我会将其标记为正确的,因为它是有道理的
    猜你喜欢
    • 2021-10-18
    • 2018-12-29
    • 2020-10-20
    • 2019-09-30
    • 2021-12-11
    • 2020-03-25
    • 2020-12-16
    • 2022-01-24
    • 2021-05-09
    相关资源
    最近更新 更多