Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Api网关中的用户授权_C#_.net Core_Authorization_Microservices_Api Gateway - Fatal编程技术网

C# Api网关中的用户授权

C# Api网关中的用户授权,c#,.net-core,authorization,microservices,api-gateway,C#,.net Core,Authorization,Microservices,Api Gateway,我试图了解微服务的体系结构,我有一个问题,关于如何正确授权Api网关中的用户,或检查其存在性,如果我有一个单独的用户服务用于注册、登录和令牌发布。 假设我有两个服务:一个用于注册、登录和接收令牌的用户服务和一个订购服务。他们有自己的数据库 我猜: 对于api网关的每个请求,向授权服务发出单独的请求,并检查其中的令牌和用户角色,然后将请求重定向到订单服务 为Api网关提供访问用户数据库的权限,以验证令牌和用户,然后将请求重定向到订单服务 将Api网关和用户服务结合起来(我认为这是个坏主意) 还是有

我试图了解微服务的体系结构,我有一个问题,关于如何正确授权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您想知道用户是否被系统识别,但没有必要根据数据库重新验证它,因为您基于令牌的签名信任它。您可能需要向我发送一个请求