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

如何从SignalR获取连接客户端的域名(ASP.NET Core+React场景)

可靠获取客户端连接域名的方案(ASP.NET Core 7 + React多域名场景)

1. API密钥绑定域名

  • 核心逻辑:给每个允许的域名分配唯一API密钥,客户端请求时携带密钥,API端通过密钥映射到对应域名。
  • 实现步骤:
    • 在appsettings.json维护密钥-域名映射:
      "DomainApiKeys": {
        "https://client1.example.com": "KEY_CLIENT1_XXXX",
        "https://client2.example.com": "KEY_CLIENT2_YYYY"
      }
      
    • 在中间件或Action过滤器中读取密钥并匹配域名:
      var apiKey = Request.Headers["X-Api-Key"].FirstOrDefault();
      var domain = Configuration.GetSection("DomainApiKeys")
                                .GetChildren()
                                .FirstOrDefault(kv => kv.Value == apiKey)?
                                .Key;
      
  • 优劣:几乎无法伪造,只要密钥不泄露就能精准对应域名;但需要给每个域名配置密钥,前端要注意密钥的安全存储(比如用环境变量)。

2. Referer头结合CORS白名单验证

  • 核心逻辑:读取浏览器自动发送的Referer头,验证该域名是否在预设的CORS白名单内,通过后记录域名。
  • 实现步骤:
    • 先配置CORS白名单:
      builder.Services.AddCors(options =>
      {
          options.AddPolicy("AllowedDomains", policy =>
          {
              policy.WithOrigins("https://client1.example.com", "https://client2.example.com")
                    .AllowAnyHeader()
                    .AllowAnyMethod();
          });
      });
      
    • 在中间件中校验Referer:
      var referer = Request.Headers.Referer.ToString();
      var allowedOrigins = Configuration.GetSection("AllowedCorsOrigins").Get<string[]>();
      var matchedDomain = allowedOrigins.FirstOrDefault(origin => referer.StartsWith(origin));
      if (!string.IsNullOrEmpty(matchedDomain))
      {
          // 记录该域名
      }
      
  • 优劣:无需额外客户端配置,但Referer可能被浏览器禁用、代理篡改,可靠性低于API密钥方案。

3. 自定义请求头+签名验证

  • 核心逻辑:客户端携带自定义头X-Client-Domain,同时用预共享密钥对域名生成签名,API端验证签名合法性后确认域名。
  • 实现步骤:
    • React客户端生成签名并携带请求头:
      const clientDomain = window.location.origin;
      const secret = import.meta.env.VITE_API_SECRET;
      // 实际建议用HMAC-SHA256生成签名,以下为简化示例
      const signature = btoa(clientDomain + secret);
      // 请求时添加头
      headers: {
          'X-Client-Domain': clientDomain,
          'X-Domain-Signature': signature
      }
      
    • API端验证签名:
      var clientDomain = Request.Headers["X-Client-Domain"].FirstOrDefault();
      var signature = Request.Headers["X-Domain-Signature"].FirstOrDefault();
      var secret = Configuration["ApiSecret"];
      var expectedSignature = Convert.ToBase64String(Encoding.UTF8.GetBytes(clientDomain + secret));
      if (signature == expectedSignature && allowedOrigins.Contains(clientDomain))
      {
          // 验证通过,记录域名
      }
      
  • 优劣:比单纯自定义头更可靠,签名难以伪造;但需要客户端处理签名逻辑,增加少许复杂度。

方案推荐

如果优先追求难以伪造,首选API密钥绑定域名方案,密钥专属对应域名,可靠性最高。若想降低客户端配置成本,可选择Referer头结合CORS验证作为次选,但要接受部分请求无Referer的情况。自定义头+签名方案介于两者之间,适合对可靠性有要求但不想维护多密钥的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:17:24