.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 最高

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

相关推荐
1-1=08 小时前
.NET Core 内存管理
.net·.netcore
1-1=014 小时前
.NET Core 配置与选项
.net·.netcore·1024程序员节
xbzb1 天前
IP、掩码、网关、DNS 到底谁管什么?网络基础与七种设备一次讲清
网络·网关·mac·ip·dns·掩码
LHICOD1 天前
Linux-1
linux·ip·vmware·虚拟机·cmd·ping
文慧的科技江湖1 天前
Token工厂技术拆解(10月28日)|月底对账多付605块,账单上缓存那一栏一直是零
token·api网关·ai应用·大模型api·token中转站
淡海水3 天前
08-02-优化-LINQ与函数式编程的GC代价
unity·c#·.netcore·linq·gc
云上工程笔记3 天前
2026年大模型Token成本测算推荐清单:输入输出、缓存、并发与峰值用量
人工智能·spring boot·缓存·token
淡海水4 天前
07-06-源码-.NET Core GC的极致优化技术
unity·架构·c#·.netcore·gc·1024程序员节
淡海水4 天前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
淡海水5 天前
07-04-源码-.NET Core GC清扫与压缩
unity·架构·c#·.netcore·gc·1024程序员节