目录
[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))

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
在 .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 后端对接。
- 核心逻辑 :
- 分配给客户端一个
AppId和AppSecret(私钥,绝不公开)。 - 客户端发送请求时,将
时间戳 (Timestamp)+随机数 (Nonce)+请求参数+AppSecret按照特定顺序拼接。 - 使用 MD5/SHA256 算法生成一个
Sign字符串,并随请求一起发送。 - 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 | 最高 |
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。