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

C# API对接React跨域请求遭CORS拦截问题求助

解决跨域场景下Web API认证重定向的CORS及OPTIONS请求问题

你的核心问题有两个:一是跨域预检OPTIONS请求访问Login.aspx时返回405未被处理,二是未登录时的重定向不符合前端跨域需求。以下是针对性的解决步骤:

1. 全局处理所有OPTIONS预检请求

因为Login.aspx是ASPX页面,默认不会处理OPTIONS请求,而之前的CORS配置可能只覆盖了API控制器路径。需要在Global.asax.cs的Application_BeginRequest中统一拦截所有OPTIONS请求,返回合法的CORS响应:

protected void Application_BeginRequest()
{
    if (Request.HttpMethod.Equals("OPTIONS", StringComparison.OrdinalIgnoreCase))
    {
        // 设置CORS响应头,允许指定源的跨域请求
        Response.StatusCode = (int)HttpStatusCode.OK;
        Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:1337");
        Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
        Response.AddHeader("Access-Control-Allow-Credentials", "true");
        Response.End();
    }
}

这段代码会直接处理所有路径的OPTIONS请求,返回200状态码,避免出现405错误。

2. 拦截认证重定向,针对跨域请求返回JSON响应

默认的认证重定向会触发浏览器对Login.aspx的跨域请求,不符合你期望的返回JSON需求。可以在Global.asax.cs的Application_EndRequest中拦截重定向响应,判断是否为跨域请求,替换为JSON输出:

protected void Application_EndRequest()
{
    // 检测是否是指向Login.aspx的302重定向
    if (Response.StatusCode == (int)HttpStatusCode.Redirect && 
        !string.IsNullOrEmpty(Response.RedirectLocation) && 
        Response.RedirectLocation.Contains("Login.aspx"))
    {
        // 获取请求的Origin头,判断是否为跨域请求
        var requestOrigin = Request.Headers["Origin"];
        if (!string.IsNullOrEmpty(requestOrigin) && requestOrigin == "http://localhost:1337")
        {
            // 清空原有重定向响应
            Response.Clear();
            // 返回401未授权状态码
            Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            Response.ContentType = "application/json";
            // 再次设置CORS头确保前端能正常接收响应
            Response.AddHeader("Access-Control-Allow-Origin", requestOrigin);
            Response.AddHeader("Access-Control-Allow-Credentials", "true");
            // 输出包含认证URL的JSON内容
            var authLoginUrl = "http://localhost:9074/Login.aspx";
            Response.Write($"{{\"isUnauthorized\": true, \"loginUrl\": \"{authLoginUrl}\"}}");
            Response.End();
        }
    }
}

3. 前端配合说明

在React发送请求时,需要开启withCredentials(如果你的认证依赖Cookie),确保CORS请求能正确携带凭证:

fetch('http://localhost:9074/Customer/GetAll/', {
  method: 'GET',
  credentials: 'include' // 对应后端的Access-Control-Allow-Credentials: true
})
.then(response => {
  if (response.status === 401) {
    return response.json().then(data => {
      // 这里可以跳转到data.loginUrl,或者处理前端登录逻辑
      window.location.href = data.loginUrl;
    });
  }
  return response.json();
})
.catch(error => console.error('请求错误:', error));

关键逻辑说明

  • OPTIONS请求处理:覆盖所有路径(包括ASPX页面),确保预检请求能得到200响应,通过CORS校验。
  • 重定向拦截:利用Application_EndRequest在响应发送前修改结果,针对跨域请求返回JSON而非重定向,既满足前端需求,又保留非跨域场景下的重定向行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:45:51