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

.NET Core 6 如何限制控制器仅允许非基础域名路径访问?

在.NET Core 6中限制控制器仅接受非基础域名路径请求的实现方案

方案一:类级路由模板+自定义路由约束

这种方式通过路由规则直接限制请求路径,不符合条件的请求会直接无法匹配路由。

  1. 定义自定义路由约束
    实现IRouteConstraint接口,检查请求路径是否包含前缀段:
public class NonRootPathConstraint : IRouteConstraint
{
    public bool Match(HttpContext? httpContext, IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var pathSegments = httpContext?.Request.Path.Value?.Split('/', StringSplitOptions.RemoveEmptyEntries);
        // 确保路径至少包含一个前缀段(如/uk/login的uk),总路径段数≥2
        return pathSegments != null && pathSegments.Length >= 2;
    }
}
  1. 注册路由约束
    在Program.cs中添加约束映射:
builder.Services.Configure<RouteOptions>(options =>
{
    options.ConstraintMap.Add("nonroot", typeof(NonRootPathConstraint));
});
  1. 修改控制器路由
    给控制器添加类级路由属性,绑定约束后的前缀参数:
[Route("{prefix:nonroot}/[controller]")]
public class AccountsController : Controller
{
    [HttpPost("LogIn")]
    public IActionResult LogIn([FromBody] LoginRequest request)
    {
        // 登录逻辑实现
        return Ok();
    }

    [HttpPost("LogOut")]
    public IActionResult LogOut([FromBody] LogoutRequest request)
    {
        // 登出逻辑实现
        return Ok();
    }
}

此时,只有www.mysite.com/xxx/Accounts/LogIn这类带前缀的请求能匹配路由,www.mysite.com/Accounts/LogIn会因不满足约束而无法访问。

方案二:自定义Action过滤器

如果不想修改原有路由结构,可通过过滤器在请求到达控制器前拦截校验:

  1. 定义过滤器属性
    继承ActionFilterAttribute,在执行Action前检查路径:
public class RequireNonRootPathAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var pathSegments = context.HttpContext.Request.Path.Value?.Split('/', StringSplitOptions.RemoveEmptyEntries);
        // 校验路径是否包含前缀段
        if (pathSegments == null || pathSegments.Length < 2)
        {
            // 返回404或403,根据业务需求调整
            context.Result = new ForbidResult();
            return;
        }
        base.OnActionExecuting(context);
    }
}
  1. 给控制器添加过滤器属性
    直接在控制器类上标记该属性,即可对所有Action生效:
[RequireNonRootPath]
public class AccountsController : Controller
{
    [HttpPost, Route("LogIn")]
    public IActionResult LogIn([FromBody] LoginRequest request)
    {
        // 登录逻辑实现
        return Ok();
    }

    [HttpPost, Route("LogOut")]
    public IActionResult LogOut([FromBody] LogoutRequest request)
    {
        // 登出逻辑实现
        return Ok();
    }
}

关于你之前的路由约束无效问题

你之前的代码中pattern: ""是空模板,且没有绑定到具体参数,导致约束无法触发。另外,默认的控制器路由可能已经匹配了基础路径的请求,使得自定义约束没有生效。需要将约束绑定到具体的路由参数上,或者使用过滤器直接拦截请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:05:21