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

.NET Core CORS配置无法拦截Postman请求的问题咨询

解决.NET Core API CORS策略对非浏览器请求无效的问题

这个问题其实挺典型的,我来帮你理清楚原因和可行的解决办法:

为什么Postman能绕过你的CORS策略?

首先得明确一个关键点:CORS是浏览器专属的安全机制。它的作用是限制浏览器里的前端脚本只能向特定源发起请求,但像Postman、curl、后端服务这类非浏览器的请求客户端,根本不会触发浏览器的CORS校验逻辑——它们不会检查Origin头,也不会拦截跨域请求。所以你的CORS配置只能管住浏览器,管不了这些工具。

如何拦截非我方前端的请求?

要实现真正的访问控制,不能只靠CORS,得结合后端的验证逻辑,下面是两种常用的方案:

1. 强制验证Origin头(拦截无Origin或非法Origin的请求)

你可以通过自定义过滤器或中间件,对所有请求的Origin头进行检查——不管是不是浏览器发起的,只要Origin不在允许列表里,或者干脆没有Origin头,直接拒绝请求。

实现自定义ActionFilter

public class ValidateOriginFilter : IActionFilter
{
    private readonly IConfiguration _config;
    private readonly string[] _allowedOrigins;

    public ValidateOriginFilter(IConfiguration config)
    {
        _config = config;
        _allowedOrigins = _config.GetSection("AllowedFrontendOrigins").Get<string[]>();
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        var requestOrigin = context.HttpContext.Request.Headers["Origin"].FirstOrDefault();

        // 规则:必须携带合法的Origin头,否则拒绝
        if (string.IsNullOrEmpty(requestOrigin) || !_allowedOrigins.Contains(requestOrigin))
        {
            context.Result = new UnauthorizedResult();
            return;
        }
    }

    public void OnActionExecuted(ActionExecutedContext context) { }
}

注册过滤器并配置允许的源

在Program.cs里注册这个过滤器:

builder.Services.AddControllers(options =>
{
    // 全局应用,也可以只给特定控制器/方法加[ServiceFilter(typeof(ValidateOriginFilter))]
    options.Filters.Add<ValidateOriginFilter>();
});

然后在appsettings.json里配置你的前端域名:

"AllowedFrontendOrigins": [
    "https://your-official-frontend.com",
    "http://localhost:3000" // 开发环境的前端地址
]

2. 结合API密钥/JWT令牌验证(更安全的方案)

Origin头其实是可以伪造的,所以如果你的API安全性要求较高,建议再加上API密钥或者JWT令牌验证,双重保障:

示例:API密钥中间件

public class ApiKeyValidationMiddleware
{
    private readonly RequestDelegate _next;
    private const string ApiKeyHeader = "X-Frontend-Api-Key";

    public ApiKeyValidationMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 检查请求头是否携带API密钥
        if (!context.Request.Headers.TryGetValue(ApiKeyHeader, out var receivedKey))
        {
            context.Response.StatusCode = StatusCodes.Status401Unauthorized;
            await context.Response.WriteAsync("Missing frontend API key");
            return;
        }

        // 从配置里获取合法密钥
        var validApiKey = context.Configuration.GetValue<string>("ApiSecurity:ValidFrontendKey");
        if (!receivedKey.Equals(validApiKey, StringComparison.OrdinalIgnoreCase))
        {
            context.Response.StatusCode = StatusCodes.Status401Unauthorized;
            await context.Response.WriteAsync("Invalid frontend API key");
            return;
        }

        // 验证通过,继续处理请求
        await _next(context);
    }
}

注册中间件

在Program.cs里添加这个中间件(要放在UseRouting之后,UseEndpoints之前):

app.UseMiddleware<ApiKeyValidationMiddleware>();

然后在appsettings.json配置密钥:

"ApiSecurity": {
    "ValidFrontendKey": "your-strong-random-api-key-here"
}

之后让你的前端在所有请求头里带上X-Frontend-Api-Key: your-strong-random-api-key-here,这样不管是谁发起的请求,没有正确的密钥都无法访问你的API。

最后提醒

CORS只是浏览器的安全防护,不能作为后端的访问控制手段。要真正拦截非授权请求,必须在后端层面做验证——上面的两种方案可以结合使用,既检查Origin头,又验证API密钥,安全性会更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:31:06