如何保护 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 请求的选项,似乎我可以使用以下选项:
- 通过每个请求发送用户名和密码,也就是基本身份验证
- 生成一个 "Client Certificate" 并随每个请求一起发送
这是仅有的两种听起来可行的方法,但我想知道如果请求来自本地主机(同一台服务器),使用这些方法是否有点过分。
是否有点矫枉过正,是否有更简单的方法来限制从本地机器到 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 无法被欺骗。
我有一个 ASP.NET MVC 网站,它使用 WebAPI、SignalR。
我希望我的服务器(托管网站的同一台服务器)向 WebAPI 控制器发出 HTTP 请求 - 我希望这样做以便我可以连接到我网站的 SignalR 功能。
我想让网站用户无法访问 WebAPI 控制器上的方法,但服务器可以。
我查看了一般保护 WebAPI 请求的选项,似乎我可以使用以下选项:
- 通过每个请求发送用户名和密码,也就是基本身份验证
- 生成一个 "Client Certificate" 并随每个请求一起发送
这是仅有的两种听起来可行的方法,但我想知道如果请求来自本地主机(同一台服务器),使用这些方法是否有点过分。
是否有点矫枉过正,是否有更简单的方法来限制从本地机器到 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 无法被欺骗。