You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制ASP.NET Web API仅接收指定域名的访问请求

ASP.NET Web API 限制指定主机访问实现方案

CORS 认知误区澄清

  • CORS 是浏览器强制执行的安全策略,仅阻止浏览器环境下的前端跨域请求,对Postman、curl、第三方服务端发起的回调请求没有任何约束能力,这就是你可以用Postman直接调用Azure上部署的API的原因。
  • Web API默认不会拦截任何非浏览器来源的请求,仅配置CORS完全达不到「仅允许指定主机调用」的需求。

功能实现方案

推荐两种可直接落地的方案,可根据自身场景选择:

方案1:代码层面实现白名单中间件(通用性最高,和部署平台无关)

自定义中间件拦截所有请求,仅放通白名单内的主机访问:

  1. 首先在appsettings.json中配置允许的主机列表:
{
  "AllowedHosts": ["localhost", "你的指定回调域名.com"]
}
  1. 编写白名单校验中间件:
public class HostWhitelistMiddleware
{
    private readonly RequestDelegate _next;
    private readonly List<string> _allowedHosts;

    public HostWhitelistMiddleware(RequestDelegate next, IConfiguration configuration)
    {
        _next = next;
        _allowedHosts = configuration.GetSection("AllowedHosts").Get<List<string>>() ?? new List<string>();
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 校验请求发起方域名用该行:var requestHost = context.Request.Headers["Origin"].FirstOrDefault()?.Replace("https://","").Replace("http://","");
        // 校验API自身访问域名用该行:var requestHost = context.Request.Host.Host;
        // 校验调用方固定IP用该行:var requestHost = context.Connection.RemoteIpAddress?.ToString();
        var requestHost = context.Request.Headers["Origin"].FirstOrDefault()?.Replace("https://","").Replace("http://","");

        if (string.IsNullOrEmpty(requestHost) || !_allowedHosts.Any(h => h.Equals(requestHost, StringComparison.OrdinalIgnoreCase)))
        {
            context.Response.StatusCode = StatusCodes.Status403Forbidden;
            await context.Response.WriteAsync("Access Denied");
            return;
        }
        await _next(context);
    }
}
  1. 在Program.cs中注册中间件,需放在路由中间件之前:
app.UseMiddleware<HostWhitelistMiddleware>();
app.UseRouting();

方案2:Azure 平台层面配置访问限制(无需修改代码)

如果API部署在Azure App Service,可直接在门户配置:找到对应App Service的「网络」菜单 -> 点击「访问限制」-> 依次添加允许的localhost、指定域名/IP规则,默认会阻止所有其他来源的访问。


额外注意事项

  • 若第三方回调服务没有固定出口IP、也不会携带Origin头,建议优先校验第三方回调自带的签名参数,一般正规第三方的回调机制都会提供签名校验规则,安全性比域名/IP校验更高。
  • 本地调试时需要将开发环境对应的本地IP、端口也加入白名单,避免调试被拦截。

内容的提问来源于stack exchange,提问作者SamyCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 01:54:07