如何限制ASP.NET Web API仅接收指定域名的访问请求
ASP.NET Web API 限制指定主机访问实现方案
CORS 认知误区澄清
- CORS 是浏览器强制执行的安全策略,仅阻止浏览器环境下的前端跨域请求,对Postman、curl、第三方服务端发起的回调请求没有任何约束能力,这就是你可以用Postman直接调用Azure上部署的API的原因。
- Web API默认不会拦截任何非浏览器来源的请求,仅配置CORS完全达不到「仅允许指定主机调用」的需求。
功能实现方案
推荐两种可直接落地的方案,可根据自身场景选择:
方案1:代码层面实现白名单中间件(通用性最高,和部署平台无关)
自定义中间件拦截所有请求,仅放通白名单内的主机访问:
- 首先在
appsettings.json中配置允许的主机列表:
{ "AllowedHosts": ["localhost", "你的指定回调域名.com"] }
- 编写白名单校验中间件:
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); } }
- 在
Program.cs中注册中间件,需放在路由中间件之前:
app.UseMiddleware<HostWhitelistMiddleware>(); app.UseRouting();
方案2:Azure 平台层面配置访问限制(无需修改代码)
如果API部署在Azure App Service,可直接在门户配置:找到对应App Service的「网络」菜单 -> 点击「访问限制」-> 依次添加允许的localhost、指定域名/IP规则,默认会阻止所有其他来源的访问。
额外注意事项
- 若第三方回调服务没有固定出口IP、也不会携带Origin头,建议优先校验第三方回调自带的签名参数,一般正规第三方的回调机制都会提供签名校验规则,安全性比域名/IP校验更高。
- 本地调试时需要将开发环境对应的本地IP、端口也加入白名单,避免调试被拦截。
内容的提问来源于stack exchange,提问作者SamyCode
相关产品推荐
相关产品推荐

