.NET Core部署在IIS/NGINX后,无需或需重部署时如何限制特定API访问?
无需重新部署代码的API访问限制方法
针对IIS部署的场景
- URL重写模块:直接修改站点根目录的
web.config,添加重写规则拦截目标API请求。比如要限制/api/sensitive的访问,可添加规则拒绝所有请求,或仅允许指定IP:
修改后无需重启站点,IIS会自动加载新配置。<rewrite> <rules> <rule name="Block Sensitive API" stopProcessing="true"> <match url="^api/sensitive(/.*)?$" /> <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Access Denied" /> <!-- 可选:仅拒绝特定IP,添加条件 --> <conditions> <add input="{REMOTE_ADDR}" pattern="^192\.168\.1\.\d+$" negate="true" /> </conditions> </rule> </rules> </rewrite> - 请求筛选模块:打开IIS管理器,找到目标站点的「请求筛选」功能,在「URL」选项卡添加拒绝规则,输入目标API路径(如
api/sensitive),保存后立即生效。也可在「IP地址和域名限制」里设置允许/拒绝的IP范围,针对整个站点或特定路径。
针对NGINX部署的场景
- Location块限制:修改站点的NGINX配置文件(如
/etc/nginx/sites-available/your-site.conf),添加匹配目标API的location块,用deny/allow指令控制访问:
执行location /api/sensitive { # 拒绝所有访问 deny all; # 或仅允许特定IP # allow 192.168.1.0/24; # deny all; return 403; }nginx -s reload重载配置,无需重启应用。 - 认证拦截:如果需要基于用户身份限制,可使用NGINX的
auth_basic做简单HTTP认证,无需修改.NET代码:
用location /api/sensitive { auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://your-dotnet-app; }htpasswd工具生成密码文件,重载配置后生效。
必须重新部署代码时的API访问限制实现
自定义授权策略
在Program.cs中配置授权服务,定义自定义策略,然后在目标API上标注授权特性:
builder.Services.AddAuthorization(options => { options.AddPolicy("RestrictedApiAccess", policy => { // 示例:仅允许Admin角色访问 policy.RequireRole("Admin"); // 或自定义需求,比如检查用户声明 // policy.RequireClaim("Permission", "AccessSensitiveApi"); }); }); // 在控制器或Action上添加 [ApiController] [Route("api/sensitive")] [Authorize(Policy = "RestrictedApiAccess")] public class SensitiveController : ControllerBase { // API逻辑 }
自定义中间件
编写一个中间件,在请求管道中检查目标API路径,根据业务规则拦截请求:
public class RestrictApiMiddleware { private readonly RequestDelegate _next; public RestrictApiMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { var restrictedPath = "/api/sensitive"; if (context.Request.Path.StartsWithSegments(restrictedPath)) { // 示例:检查用户是否为Admin if (!context.User.IsInRole("Admin")) { context.Response.StatusCode = StatusCodes.Status403Forbidden; await context.Response.WriteAsync("Access Denied"); return; } } await _next(context); } } // 在Program.cs中注册中间件 app.UseMiddleware<RestrictApiMiddleware>();
配置驱动的开关
如果需要后续灵活调整限制规则,可结合配置文件实现:
- 在
appsettings.json中添加配置:
"ApiRestrictions": { "RestrictedPaths": ["/api/sensitive"], "AllowedRoles": ["Admin"] }
- 在中间件或授权逻辑中读取配置,判断是否允许访问。这种方式第一次部署后,后续只需修改配置文件即可调整规则,无需再次重新部署代码。
内容的提问来源于stack exchange,提问作者tim neet
相关产品推荐
相关产品推荐

