C# Api网关中的用户授权
我试图了解微服务的体系结构,我有一个问题,关于如何正确授权Api网关中的用户,或检查其存在性,如果我有一个单独的用户服务用于注册、登录和令牌发布。 假设我有两个服务:一个用于注册、登录和接收令牌的用户服务和一个订购服务。他们有自己的数据库 我猜:C# Api网关中的用户授权,c#,.net-core,authorization,microservices,api-gateway,C#,.net Core,Authorization,Microservices,Api Gateway,我试图了解微服务的体系结构,我有一个问题,关于如何正确授权Api网关中的用户,或检查其存在性,如果我有一个单独的用户服务用于注册、登录和令牌发布。 假设我有两个服务:一个用于注册、登录和接收令牌的用户服务和一个订购服务。他们有自己的数据库 我猜: 对于api网关的每个请求,向授权服务发出单独的请求,并检查其中的令牌和用户角色,然后将请求重定向到订单服务 为Api网关提供访问用户数据库的权限,以验证令牌和用户,然后将请求重定向到订单服务 将Api网关和用户服务结合起来(我认为这是个坏主意) 还是有
还是有更好的猜测?我想你有很多方法可以做到这一点 我可以告诉您如何在AWS中使用无服务器体系结构(正如我所做的那样): 您可以创建服务(lambdas),配置JWT授权程序(API网关),并为您的功能使用授权程序,还可以选择为每个功能定义所需的权限(范围)。您可以不使用任何自定义代码 你可以看到关于它如何工作的更好的解释 您还可以编写自己的authorizer函数,用于验证请求 p、 API网关可以缓存结果,这样就不需要为每个请求调用授权者
我不知道你是想自己管理基础设施还是使用云提供商提供的服务,但我认为它至少可以给你一个如何设计这种东西的线索。我认为你有很多方法可以做到这一点 我可以告诉您如何在AWS中使用无服务器体系结构(正如我所做的那样): 您可以创建服务(lambdas),配置JWT授权程序(API网关),并为您的功能使用授权程序,还可以选择为每个功能定义所需的权限(范围)。您可以不使用任何自定义代码 你可以看到关于它如何工作的更好的解释 您还可以编写自己的authorizer函数,用于验证请求 p、 API网关可以缓存结果,这样就不需要为每个请求调用授权者
我不知道你是想自己管理基础设施还是使用云提供商提供的服务,但我认为它至少可以给你一个关于如何设计这种东西的线索。我会做一些假设,并说你在谈论JWT令牌,授权是使用OAuth2完成的 在完成用户身份验证之后,通过中间的一些步骤,用户最终将拥有一个JWT令牌。这个JWT令牌包含3个部分,其中一个是签名。当JWT内容的其余部分是纯文本时,此签名是加密的,没有密钥无法解密。令牌的内容以及签名在授权服务器上使用密钥进行签名。任何拥有这把钥匙的人都可以读这封信。此密钥也是一种识别代币发行人的方法。这样,您可以说您信任此令牌,因为它是由您信任的人发出的。令牌中的任何更改(无需重新加密)都将导致令牌无效。令牌还包含授权/特权 请注意,所提及的“密钥”可能因加密算法而异 基于此,您不需要针对数据库用户检查每个请求 为了更好地理解,请查看OAuth2协议(可能还有OIDC)
另外我将做一些假设,并说您正在谈论JWT令牌,授权是使用OAuth2完成的 在完成用户身份验证之后,通过中间的一些步骤,用户最终将拥有一个JWT令牌。这个JWT令牌包含3个部分,其中一个是签名。当JWT内容的其余部分是纯文本时,此签名是加密的,没有密钥无法解密。令牌的内容以及签名在授权服务器上使用密钥进行签名。任何拥有这把钥匙的人都可以读这封信。此密钥也是一种识别代币发行人的方法。这样,您可以说您信任此令牌,因为它是由您信任的人发出的。令牌中的任何更改(无需重新加密)都将导致令牌无效。令牌还包含授权/特权 请注意,所提及的“密钥”可能因加密算法而异 基于此,您不需要针对数据库用户检查每个请求 为了更好地理解,请查看OAuth2协议(可能还有OIDC)
另外您可能误解了,例如,我们正在请求创建订单,但我们必须检查传输的用户ID,为此,我们需要联系用户服务。此外,每个请求必须包含一个也需要验证的令牌。@Mccree您想知道用户是否被系统识别,但没有必要根据数据库重新验证它,因为您基于令牌的签名信任它。您可能需要发送请求以获取令牌中未存储的数据。此外,ID不得以人类可读的形式存储,如int。最好使用UUID。可能您误解了,例如,我们正在请求创建订单,但我们必须检查传输的用户ID,为此,我们需要联系用户服务。此外,每个请求必须包含一个也需要验证的令牌。@Mccree您想知道用户是否被系统识别,但没有必要根据数据库重新验证它,因为您基于令牌的签名信任它。您可能需要向我发送一个请求