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

React+ASP.NET Core:登录成功后调用授权接口返回405问题排查

问题排查与解决

先澄清:405不是未登录

你提到的405响应是HTTP请求方法不允许,并非用户未登录(未登录应返回401 Unauthorized)。先检查前端的planApi.planPlanIdGet是否用了错误的请求方式(比如POST),后端接口标注了[HttpGet("{planId}")],必须用GET请求调用。

登录状态无法传递的核心原因

你的后端用了ASP.NET Core Identity的PasswordSignInAsync,这是基于Cookie认证的逻辑,但React作为前后端分离的前端,跨域场景下默认不会自动携带Cookie,导致后续请求无法识别登录状态:

解决步骤(Cookie方案)

  1. 后端跨域配置必须允许凭证
    在Program.cs中添加跨域策略时开启AllowCredentials:

    builder.Services.AddCors(options =>
    {
        options.AddPolicy("AllowReact", policy =>
        {
            policy.WithOrigins("你的React应用域名,比如http://localhost:3000")
                  .AllowAnyHeader()
                  .AllowAnyMethod()
                  .AllowCredentials(); // 关键:必须开启才能让Cookie跨域传递
        });
    });
    
    // 注意要在UseRouting之后、UseAuthorization之前启用Cors
    app.UseCors("AllowReact");
    
  2. 前端请求必须携带凭证
    如果你用的是自动生成的API客户端(比如OpenAPI Generator),初始化时要开启withCredentials:

    const planApi = new PlanApi({
        basePath: "你的API域名,比如http://localhost:5000",
        withCredentials: true
    });
    const accountApi = new AccountApi({
        basePath: "你的API域名",
        withCredentials: true
    });
    

    若用axios,每个请求需添加withCredentials: true配置。

更适合Web API的方案:改用JWT令牌

Cookie在前后端分离场景下配置繁琐,推荐使用JWT:

  1. 后端配置JWT认证,登录接口验证成功后生成并返回JWT令牌;
  2. 前端将令牌存储在localStorage或内存中,后续请求在请求头里添加Authorization: Bearer {你的令牌};
  3. 后端的[Authorize]特性会自动验证JWT令牌,识别用户身份。

登录接口的小优化

你的登录代码用了.Result同步阻塞,容易引发死锁,改成异步调用:

[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] UserLoginModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var user = await _userManager.FindByEmailAsync(model.Email);
    if (user == null)
    {
        return BadRequest(new { message = "用户不存在" });
    }

    var result = await _signInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, lockoutOnFailure: false);

    return result.Succeeded 
        ? Ok(new { message = "Login successful" }) 
        : BadRequest(new { message = "Login failed" });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 18:22:11