.NetCore Webapi 接口验证请求来源

目录

[1. 验证域名来源:CORS(跨域资源共享)](#1. 验证域名来源:CORS(跨域资源共享))

[2. 验证调用方身份:API Key / Token 认证](#2. 验证调用方身份:API Key / Token 认证)

[3. 防止请求伪造:API 接口签名机制 (Sign)](#3. 防止请求伪造:API 接口签名机制 (Sign))

[4. 限制服务器 IP:IP 白名单 (IP Whitelisting)](#4. 限制服务器 IP:IP 白名单 (IP Whitelisting))

5.总结与方案推荐


如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

在 .NET Core Web API 中,验证请求来源(通常指验证客户端身份 、请求域名 或请求是否被篡改)是保障 API 安全的重要环节。

实现这一目标主要有以下几种核心方案,你可以根据具体的应用场景(如:内部系统互调、前后端分离、第三方对接)进行选择:

1. 验证域名来源:CORS(跨域资源共享)

如果你的 API 是给浏览器端(如 Vue, React)使用的,可以通过配置 CORS 策略来限制只有特定的域名可以访问你的 API。

  • 适用场景:浏览器端应用、前后端分离项目。
  • 实现方法:

// 在 Program.cs 中配置

builder.Services.AddCors(options =>

{

options.AddPolicy("AllowSpecificOrigin",

policy => policy.WithOrigins("https://example.com") // 仅允许此域名访问

.AllowAnyMethod()

.AllowAnyHeader());

});

var app = builder.Build();

app.UseCors("AllowSpecificOrigin"); // 启用中间件

  • 注意 :CORS 只能防浏览器,无法防止 Postman、Curl 或后端服务器发起的伪造请求。

2. 验证调用方身份:API Key / Token 认证

为每个合法的客户端分配一个唯一的 API Key (常用于第三方对接)或使用 JWT Token (常用于用户登录)。客户端必须在请求头(如 X-API-KEY 或 Authorization )中携带该凭证。

  • 适用场景:第三方开发者对接、前后端分离、移动端 App。
  • 实现方法(中间件验证 API Key 示例):

public class ApiKeyMiddleware

{

private readonly RequestDelegate _next;

private const string APIKEYNAME = "X-API-KEY";

public ApiKeyMiddleware(RequestDelegate next) => _next = next;

public async Task InvokeAsync(HttpContext context)

{

if (!context.Request.Headers.TryGetValue(APIKEYNAME, out var extractedApiKey))

{

context.Response.StatusCode = 401;

await context.Response.WriteAsync("API Key 缺失");

return;

}

var expectedApiKey = "预留的合法ApiKey_abcdefg"; // 实际应从配置或数据库读取

if (!expectedApiKey.Equals(extractedApiKey))

{

context.Response.StatusCode = 401;

await context.Response.WriteAsync("未授权的请求来源");

return;

}

await _next(context);

}

}

3. 防止请求伪造:API 接口签名机制 (Sign)

如果需要极高的安全性,防止请求在传输过程中被篡改,可以使用**参数签名(Signature)**机制。

  • 适用场景:开放平台、支付接口(如微信/支付宝支付)、App 后端对接。
  • 核心逻辑 :
    1. 分配给客户端一个 AppId 和 AppSecret (私钥,绝不公开)。
    2. 客户端发送请求时,将 时间戳 (Timestamp) + 随机数 (Nonce) + 请求参数 + AppSecret 按照特定顺序拼接。
    3. 使用 MD5/SHA256 算法生成一个 Sign 字符串,并随请求一起发送。
    4. Web API 收到请求后,用同样的规则计算 Sign ,对比是否一致。
  • 作用 :既验证了来源(只有拥有 AppSecret 的人才能算出对的 Sign),又防了重放攻击(靠时间戳和随机数)。

4. 限制服务器 IP:IP 白名单 (IP Whitelisting)

如果你的 API 只允许特定的服务器(如合作伙伴的固定服务器、公司的公共网关)调用,可以直接限制请求的 IP 地址。

  • 适用场景:服务器互调(B2B 对接)、内部微服务通信。
  • 实现方法(Action 过滤器示例):

public class IpWhitelistAttribute : ActionFilterAttribute

{

private readonly List<string> _safelist = new() { "127.0.0.1", "::1", "192.168.1.100" };

public override void OnActionExecuting(ActionExecutingContext context)

{

var remoteIp = context.HttpContext.Connection.RemoteIpAddress;

if (remoteIp == null || !_safelist.Contains(remoteIp.ToString()))

{

context.Result = new UnauthorizedObjectResult("IP 地址未授权");

return;

}

base.OnActionExecuting(context);

}

}

注意 :如果 API 部署在 Nginx 或负载均衡器后面,直接获取 RemoteIpAddress 可能是 Nginx 的 IP。此时需要配置 UseForwardedHeaders 中间件,并从 X-Forwarded-For 请求头中读取真实 IP。

5.总结与方案推荐

场景 推荐方案 安全级别
纯浏览器前端(Vue/React) CORS + JWT Token 中
对外开放的第三方接口 API Key + 接口签名 (Sign) 高
固定的企业级伙伴对接 IP 白名单 + API Key 最高

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
玩AI的奶茶1 天前
从零到跑通:在算家云上部署大模型的完整操作手册(实例创建 / 镜像选择 / 远程连接 / 成本控制)
人工智能·ai·gpu算力·token·算力租赁
YumiProxy1 天前
代理IP自动切换实战:会话保持与请求头配置避坑指南
服务器·网络·网络协议·tcp/ip·ip
信马堂2 天前
WorkBuddy 接入第三方模型 API 全流程:安装与配置实录
人工智能·大模型·token·ai算力·workbuddy
liangshanbo12153 天前
面试题:AI 产品里,前端怎么降低 Token 消耗?
token
xiangshangdemayi3 天前
Strata教程:让GISer真正实现了token自由
ai·gis·教程·token·strata·自由
洋不写bug3 天前
初识网络通信,网络发展背景,TCP/IP五层模型简介
计算机网络·网络编程·协议·ip·端口号·tcp/ip模型·网络发展背景
wdfk_prog3 天前
LWIP教程 00:从网线上的电信号到 lwIP——PHY、MAC、DMA 与 `netif` 的完整边界
运维·网络·笔记·学习·ip
网络毒刘4 天前
Token 用量观测实战:从会话结构拆前缀/工具/生成,建立个人降本仪表盘
人工智能·性能优化·token·cursor
cpolar技术支持4 天前
Spring Boot 接口本地正常,异地前端却报跨域?用 cpolar 跑通 CORS 预检与白名单
java·springboot·cpolar·前后端分离·cors
谷哥的小弟6 天前
网络连接测试命令Test-NetConnection
测试·ip·端口·网络连接