C#REST API:允许来自受信任服务器的呼叫



我有两个运行相同C#Web服务的Web服务器。

我希望服务器1调用服务器2的Web API获取数据。

但是,我只希望服务器1能够称呼它,我不希望客户端称呼它:

[HttpGet]
      public HttpResponseMessage GetData()
      {
                If(IsCallFromInternalWebServer() ) // Call is from other server
                 {
                        // return Data
                 }
                 Else 
                 {
                     return Request.CreateResponse(HttpStatusCode.Unauthorized);
                 }
      }

我可以按以下方式获取呼叫的IP地址:

public static string GetCallerIP(HttpRequest request)
{
    string ip = request.Headers["X-Forwarded-For"]; // AWS compatibility
    if (string.IsNullOrEmpty(ip))
    {
        ip = request.UserHostAddress;
    }
    return ip;
}

通过检查IP地址,这是允许呼叫的好方法。

有更好的方法吗?

外部呼叫不应在同一服务上混合。我的意思是,如果您在一项服务上,您的呼叫(操作)需要由互联网上的客户拨打,也需要在您自己的服务上访问,并且应该将此服务分为两者,公共和内部。这将大大降低攻击表面。

已经是这种情况,内部服务不应有公共终点,即。在Azure或AWS中,您不应将公共IP地址分配给该服务。您仍然可以通过其内部IP从其他服务访问它。但是,作为深入防御的一个例子,您仍然应该对后端进行适当的身份验证。限制呼叫者的IP地址可能会有所帮助,并且可能会有所减轻风险,但它不应该是唯一的安全层。

对于后端(内部)服务的身份验证,当您谈论C#.NET Web API时,Windows Authentication是一个简单的选择,您可以在IIS中进行设置,并且您可以授权运行其他应用程序的身份(或服务)致电内部。请注意,尽管这是一个固有的信任,但如果内部服务没有进一步的授权,那么对前端的妥协也将自动成为后端一个人的完全妥协。

您还可以按照其他人的建议使用令牌(OAuth,JWT或其他),但是您是对的,然后需要以某种方式管理这些令牌,因为这不是关于对外部客户进行认证,而是您的内部客户仅应用程序或服务,实际上可能并不那么困难。

最新更新