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

如何确保.NET API仅接收特定IP地址的请求?

解决CORS配置无效及API安全锁定问题

你当前的CORS配置里policy.WithOrigins()没有传入任何允许的源,这种情况下框架会默认允许所有跨域请求,所以才会出现能从任意IP访问的情况。另外要明确:CORS是浏览器层面的跨域限制,不是服务器端的访问控制——如果用Postman这类工具直接调用API,CORS规则不会生效,要真正锁定API还需要额外的安全措施。

1. 修正CORS策略配置

修改代码,在WithOrigins()里指定允许的具体域名/IP,比如只允许你的前端应用域名:

// 定义策略名称常量
const string MyAllowSpecificOrigins = "MyAllowSpecificOrigins";

builder.Services.AddCors(options =>
{
    options.AddPolicy(name: MyAllowSpecificOrigins, policy =>
    {
        // 替换成你实际允许的源,多个用逗号分隔
        policy.WithOrigins("https://your-frontend-domain.com", "http://localhost:3000")
              .AllowAnyHeader() // 也可按需限制Header,比如WithHeaders("Content-Type", "Authorization")
              .AllowAnyMethod(); // 或指定允许的HTTP方法,比如WithMethods("GET", "POST")
    });
});

// 注意:UseCors要放在UseRouting之后、UseAuthorization之前
app.UseCors(MyAllowSpecificOrigins);

2. 限制Swagger的访问权限

如果不想让任意IP访问Swagger接口,可通过以下两种方式处理:

方法一:仅在开发环境启用Swagger

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

这样生产环境就不会暴露Swagger文档了。

方法二:给Swagger添加基础身份验证

如果生产环境必须使用Swagger,可添加账号密码验证:

builder.Services.AddSwaggerGen();

app.UseSwagger();
app.UseSwaggerUI();

// 给Swagger路由添加访问验证
app.Map("/swagger", swaggerApp =>
{
    swaggerApp.Use(async (context, next) =>
    {
        var authHeader = context.Request.Headers.Authorization;
        if (authHeader != null && authHeader.StartsWith("Basic "))
        {
            var encodedCred = authHeader.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries)[1]?.Trim();
            var decodedCred = Encoding.UTF8.GetString(Convert.FromBase64String(encodedCred));
            var username = decodedCred.Split(':', 2)[0];
            var password = decodedCred.Split(':', 2)[1];

            // 替换成你自己的验证逻辑
            if (username == "admin" && password == "your-secure-password")
            {
                await next.Invoke();
                return;
            }
        }

        context.Response.Headers["WWW-Authenticate"] = "Basic";
        context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
    });
});

3. 服务器端访问控制(真正锁定API)

CORS无法阻止非浏览器的API调用,要实现真正的访问限制,还需结合以下手段:

  • API密钥验证:要求每个请求携带合法的API密钥,在中间件或过滤器中验证
  • JWT令牌验证:实现基于角色/权限的身份验证,只有携带有效令牌的请求才能访问API
  • IP白名单:在服务器(如IIS、Nginx)或代码层面限制允许访问的IP范围

举个简单的IP白名单中间件示例:

app.Use(async (context, next) =>
{
    // 替换成你允许的IP列表
    var allowedIps = new HashSet<string> { "192.168.1.100", "127.0.0.1" };
    var clientIp = context.Connection.RemoteIpAddress?.ToString();

    if (!allowedIps.Contains(clientIp))
    {
        context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
        await context.Response.WriteAsync("IP not allowed");
        return;
    }

    await next.Invoke();
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:20:30