如何确保.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
相关产品推荐
相关产品推荐

