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

如何限制Nginx部署的ASP.NET Core Web API仅允许Angular客户端访问?

问题1:限制API仅被客户端应用访问的正确方法

要实现该需求,需结合CORS验证 + Nginx请求来源校验(纯前端场景无法做到绝对拦截,但可覆盖绝大多数非授权访问):

  • 强化ASP.NET Core的CORS规则,严格限定允许的Origin;
  • 在Nginx层面校验请求的Origin或Referer头,拦截不符合规则的请求;
  • 可选:添加自定义API密钥验证(需通过HTTPS传输,且密钥不能硬编码在前端代码中)。

问题2:Nginx配置实现的可行性及缺失配置

完全可行,你之前的错误在于将API限制为仅允许127.0.0.1访问——这会拦截所有外部请求(包括用户浏览器中Angular发起的请求,因为这类请求的来源IP是客户端IP,而非服务器本地的127.0.0.1)。

正确的Nginx配置方案

方案1:校验Origin头(基础拦截)

在API的Nginx配置location /块中添加Origin校验,仅允许你的Angular域名:

server {
    listen        80;
    server_name   api.test.com;

    location / {
        # 仅允许指定的Angular Origin
        if ($http_origin !~* ^(http://localhost:4201|https://app.test.com)$) {
            return 403;
        }

        proxy_pass         http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        # 传递Origin头给后端,配合CORS中间件二次验证
        proxy_set_header   Origin $http_origin;
    }
}

方案2:结合Referer校验(生产环境增强)

若担心Origin被模拟,可同时校验Referer头:

server {
    listen        80;
    server_name   api.test.com;

    location / {
        # 校验Referer,仅允许来自Angular域名的请求
        if ($http_referer !~* ^(http://localhost:4201|https://app.test.com)/) {
            return 403;
        }
        # 同时保留Origin校验
        if ($http_origin !~* ^(http://localhost:4201|https://app.test.com)$) {
            return 403;
        }

        proxy_pass         http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Origin $http_origin;
    }
}

关键注意事项

  1. 不要修改server_name为localhost或127.0.0.1,需保持为对外访问的api.test.com;
  2. Nginx校验规则需与ASP.NET Core的CORS配置保持一致,避免规则冲突;
  3. 生产环境必须启用HTTPS,防止请求头被篡改。

是否需要ASP.NET Core额外代码?

当前的CORS配置已满足基础需求,若需更严格控制,可添加自定义中间件验证自定义请求头(如API密钥):

app.Use(async (context, next) =>
{
    // 验证自定义X-API-Key头(示例,需通过环境变量注入密钥)
    if (!context.Request.Headers.TryGetValue("X-API-Key", out var apiKey) || apiKey != Environment.GetEnvironmentVariable("API_KEY"))
    {
        context.Response.StatusCode = StatusCodes.Status403Forbidden;
        await context.Response.WriteAsync("Unauthorized access");
        return;
    }
    await next();
});

// 该中间件需放在UseCors之前
app.UseCors(policy => policy
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .WithOrigins("http://localhost:4201", "https://app.test.com")
            );

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:31:11