.NET Core如何为Action/Controller配置专属AllowedHosts?
为.NET Core API的Action/Controller配置专属AllowedHosts(基于特性注解)
不用写全局中间件,直接自定义一个授权特性就能实现针对Action/Controller的专属Host限制,下面是完整实现示例:
1. 自定义AllowedHosts授权特性
创建一个继承IAuthorizationFilter的特性类,负责检查请求来源Host是否在允许列表内:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] public class AllowedHostsAttribute : Attribute, IAuthorizationFilter { private readonly HashSet<string> _allowedHosts; // 构造函数接收逗号分隔的允许Host列表 public AllowedHostsAttribute(string allowedHosts) { _allowedHosts = new HashSet<string>( allowedHosts.Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(h => h.Trim().ToLowerInvariant()), StringComparer.OrdinalIgnoreCase); } public void OnAuthorization(AuthorizationFilterContext context) { // 获取请求的Host(不含端口) var requestHost = context.HttpContext.Request.Host.Host.ToLowerInvariant(); // 检查是否匹配允许列表,支持通配符前缀(如*.example.com) var isAllowed = _allowedHosts.Any(h => h == requestHost || (h.StartsWith("*.") && requestHost.EndsWith(h.Substring(2)))); // 不匹配则返回401未授权 if (!isAllowed) { context.Result = new UnauthorizedResult(); } } }
2. 在Controller/Action上使用特性
直接在目标Controller或Action上标注该特性,指定允许的Host即可:
// 给整个Controller设置允许的Host,所有Action默认继承此规则 [AllowedHosts("example.com,*.example.org")] [ApiController] [Route("api/[controller]")] public class OrdersController : ControllerBase { // 单个Action可以单独设置专属规则,覆盖Controller的配置 [AllowedHosts("specific-client.com")] [HttpGet] public IActionResult GetOrders() { return Ok(new { Message = "Orders retrieved successfully" }); } // 此Action继承Controller的AllowedHosts规则 [HttpPost] public IActionResult CreateOrder() { return Ok(new { Message = "Order created successfully" }); } }
额外说明
- 特性内置了大小写不敏感处理,避免因Host大小写差异导致误拦截;
- 支持通配符前缀(如
*.example.com),可匹配该域名下的所有子域名; - 如果需要更复杂的匹配逻辑(比如正则匹配),可以修改
isAllowed的判断逻辑; - 这种方式比全局中间件更灵活,能精准控制单个接口的访问来源限制。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

