.NET Core 6 如何限制控制器仅允许非基础域名路径访问?
在.NET Core 6中限制控制器仅接受非基础域名路径请求的实现方案
方案一:类级路由模板+自定义路由约束
这种方式通过路由规则直接限制请求路径,不符合条件的请求会直接无法匹配路由。
- 定义自定义路由约束
实现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; } }
- 注册路由约束
在Program.cs中添加约束映射:
builder.Services.Configure<RouteOptions>(options => { options.ConstraintMap.Add("nonroot", typeof(NonRootPathConstraint)); });
- 修改控制器路由
给控制器添加类级路由属性,绑定约束后的前缀参数:
[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过滤器
如果不想修改原有路由结构,可通过过滤器在请求到达控制器前拦截校验:
- 定义过滤器属性
继承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); } }
- 给控制器添加过滤器属性
直接在控制器类上标记该属性,即可对所有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
相关产品推荐
相关产品推荐

