如何保护 WebAPI 上的控制器仅供本地计算机使用

How to secure a controller on WebAPI for use by only the local machine

我有一个 ASP.NET MVC 网站,它使用 WebAPI、SignalR。

我希望我的服务器(托管网站的同一台服务器)向 WebAPI 控制器发出 HTTP 请求 - 我希望这样做以便我可以连接到我网站的 SignalR 功能。

我想让网站用户无法访问 WebAPI 控制器上的方法,但服务器可以。

我查看了一般保护 WebAPI 请求的选项,似乎我可以使用以下选项:

这是仅有的两种听起来可行的方法,但我想知道如果请求来自本地主机(同一台服务器),使用这些方法是否有点过分。

是否有点矫枉过正,是否有更简单的方法来限制从本地机器到 WebAPI 控制器的 HTTP 请求?

如果您只想接受来自同一台机器的请求,您可以检查请求上下文的 IsLocal 属性 MSDN

HttpRequest.Context.Request.IsLocal

然后您可以将其构建到自定义授权属性中并在全局注册它,从而在您的所有 Web API 控制器上强制执行要求。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Other Web API configuration code goes here

        // This is a globally registered attribute
        config.Filters.Add(new LocalRequestOnlyAttribute()); 
    }
}

public class LocalRequestOnlyAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext context)
    {
        return context.RequestContext.IsLocal;
    }
}

我想澄清 HttpRequest.Context.Request.IsLocal 是否安全。

我刚刚从 HttpWorkerRequest 中反编译了 IsLocal(),它揭示了以下代码:

internal bool IsLocal()
{
    string remoteAddress = this.GetRemoteAddress();
    if (string.IsNullOrEmpty(remoteAddress))
    {
        return false;
    }
    if (remoteAddress == "127.0.0.1" || remoteAddress == "::1")
    {
        return true;
    }
    if (remoteAddress == this.GetLocalAddress())
    {
        return true;
    }
    return false;
}

前两个检查看起来不错,但我很怀疑,想检查一下 this.GetLocalAddress() returns 要检查的内容。

System.Web.Hosting.IIS7WorkerRequest 的实例中,反编译为以下内容:

public override string GetLocalAddress()
{
    return this.GetServerVariable("LOCAL_ADDR");
}

在我的本地环境中这个 returns 127.0.0.1,看起来一切正常!

此外,根据 this post,localhost 无法被欺骗。