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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:25:02