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

.NET Core部署在IIS/NGINX后,无需或需重部署时如何限制特定API访问?

无需重新部署代码的API访问限制方法

针对IIS部署的场景

  • URL重写模块:直接修改站点根目录的web.config,添加重写规则拦截目标API请求。比如要限制/api/sensitive的访问,可添加规则拒绝所有请求,或仅允许指定IP:
    <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会自动加载新配置。
  • 请求筛选模块:打开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>();

配置驱动的开关

如果需要后续灵活调整限制规则,可结合配置文件实现:

  1. 在appsettings.json中添加配置:
"ApiRestrictions": {
  "RestrictedPaths": ["/api/sensitive"],
  "AllowedRoles": ["Admin"]
}
  1. 在中间件或授权逻辑中读取配置,判断是否允许访问。这种方式第一次部署后,后续只需修改配置文件即可调整规则,无需再次重新部署代码。

内容的提问来源于stack exchange,提问作者tim neet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:28:21