如果我们已经在 .Net Core 微服务 API 网关中实现了授权,我们还需要在所有微服务中实现吗?
Posted
技术标签:
【中文标题】如果我们已经在 .Net Core 微服务 API 网关中实现了授权,我们还需要在所有微服务中实现吗?【英文标题】:If we have already implemented the authorization in .Net Core Micro-service API Gateway do we need to implement in all micro services as well? 【发布时间】:2019-07-04 23:56:44 【问题描述】:@这里,请帮助我理解使用 API Gateway 进行微服务身份验证。
举个例子 - 我有 10 个不同的独立部署的微服务,我已经为所有微服务实现了 API 网关,这意味着所有请求都将通过该网关,而不是在我添加的每个微服务中添加授权/JWt使用这种方法的 API 网关一切正常,但我的疑问和问题是
1 如果最终用户有已部署微服务的 URL 并且他尝试在没有网关的情况下连接它(因为我这里没有授权位置,我该如何停止这种情况,我需要在其中添加相同的授权逻辑吗?每个微服务也是如此,但最终会导致重复代码,那么 API 网关有什么用。
如果需要任何其他输入,请告诉我,希望我能正确解释我的问题。
谢谢 CP Variyani
【问题讨论】:
【参考方案1】:一般来说:您的微服务要么是内部的,要么是公共的。换句话说,它们要么可以被外部世界访问,要么不能被外部世界访问。如果它们是内部的,您可以选择让它们不受保护,因为保护基本上来自您的防火墙。如果它们是公开的,那么无论是否直接使用它们都应该要求身份验证。
但是,最好始终只要求进行身份验证,即使它们仅限于内部。使用客户端身份验证和范围很容易确保只有您的应用程序可以访问服务。然后,如果存在某种错误配置,导致服务泄露到外部网络(即整个 Internet)或防火墙中打开了一个漏洞,您仍然受到保护。
【讨论】:
感谢 Chris 完全同意你的观点,但这个答案又给我带来了同样的困惑——如果我必须在所有服务中进行身份验证,那么我想根本不需要在 api 网关中进行身份验证因为每项服务都已经有了它.. 不一定。每个服务只能限定到您的网关,网关客户端对每个服务进行身份验证,您的应用程序对网关进行身份验证。这有效地阻止了应用程序甚至直接使用服务。【参考方案2】:API 网关用于处理诸如“授权”、TLS 等横切关注点以及服务的单点入口。
关于您的问题,如果您的 API 服务公开供公众访问,那么您必须保护它们。通常 API 网关是公开的唯一点,其余服务位于防火墙(虚拟网络)后面,只能由 API 网关访问,除非您有某些理由公开您的服务。
例如如果您使用 Kubernetes 进行服务部署,您可以将您的服务设置为只能在集群内部访问(服务具有私有 IP),并且访问它们的唯一方法是 API 网关。那时你不需要做任何特别的事情。 但是,如果您的服务因任何原因被公开(具有公共 IP),那么您必须保护它们。所以简而言之,这取决于您如何部署它们以及它们是否具有与之关联的公共 IP。
根据您的以下 cmets。您应该在 API 网关中进行身份验证,并将请求中的令牌传递给您的服务。您的服务只会对令牌进行身份验证,而不是重做整个身份验证。这样,如果您想更新/更改身份验证提供程序或 flow ,将其保存在 API 网关中会更容易。
【讨论】:
以上是关于如果我们已经在 .Net Core 微服务 API 网关中实现了授权,我们还需要在所有微服务中实现吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务
.net core 微服务之Api网关(Api Gateway)