.NET Core React模板项目调用B2C登录时CORS无Allow-Origin错误求助
兄弟,我来帮你捋捋这俩问题——先搞定CORS,再解决那个冒出来的404,都是我踩过的坑,应该能帮到你!
1. 别搞反中间件顺序!
.NET Core的中间件顺序真的是生死线,UseCors必须放在正确的位置才能生效。你得确保它在UseRouting之后,UseAuthorization和UseEndpoints之前,代码大概是这样:
app.UseRouting(); // 重点:这行必须放在UseRouting之后,UseAuthorization之前! app.UseCors("AllowMyOrigin"); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapFallbackToFile("index.html"); // React模板自带的,千万别漏了 });
我见过好多人把UseCors扔到UseEndpoints后面,那完全白搭,请求都处理完了才来加CORS头,浏览器肯定不认。
2. 核对前端Origin的每一个字符
你的策略里指定了https://localhost:44300,一定要确认:
- 你的React app真的跑在这个HTTPS端口上!打开浏览器地址栏看看,是不是
https://localhost:44300,别写成HTTP或者端口号错了(比如手滑写成44301); - 用浏览器开发者工具的Network标签,看请求头里的
Origin值,是不是和你配置的完全一致?多一个斜杠、少个s都不行!
3. 检查有没有其他中间件搞事情
比如如果你的API开了HSTS或者其他安全中间件,可能会覆盖CORS头。另外,如果你在控制器或者Action上贴了[EnableCors]特性,要确保特性里指定的策略名和你注册的AllowMyOrigin完全一致,或者干脆把特性删掉,用全局的UseCors更省心。
你用CORS插件绕过检查后出现的404,其实是之前的CORS错误掩盖了真正的问题——这个请求是发向Azure AD B2C的OIDC配置地址,和你的Web API无关!
1. 核对B2C的配置细节
- 租户域名:
domainname.onmicrosoft.com是不是你实际的Azure AD B2C租户域名?别打错字,比如把租户名拼错了; - 策略名称:
b2c_1_sign_up是不是你在Azure门户里创建的用户流/自定义策略的准确名字?用户流的格式一般是b2c_1_<策略名>,比如注册流如果叫signup,那应该是b2c_1_signup(sign和up之间没有下划线),你这里多了个下划线,会不会是这个原因? - 策略有没有发布:如果是自定义策略,必须在Azure门户里点「发布」按钮才会生效;用户流创建后默认生效,但也得确认状态正常。
2. 检查前端的身份认证配置
如果你的React app用了MSAL.js这类库,一定要核对authority配置是不是正确的,应该是类似这样:
const authority = "https://login.microsoftonline.com/tfp/domainname.onmicrosoft.com/b2c_1_sign_up";
别把这个地址指向你自己的Web API,要直接指向Azure的B2C端点。另外,检查React的setupProxy.js有没有把这个路径错误地代理到你的API,要是代理了,那请求就会发到你的API上,自然返回404。
最后给个小建议:先别用CORS插件,专注解决自己API的CORS问题。用浏览器Network标签看请求的响应头,有没有Access-Control-Allow-Origin,没有的话就回头查中间件顺序和策略配置。等API的CORS正常了,再处理身份认证的404问题,别把俩问题混在一起,越搞越乱。
内容的提问来源于stack exchange,提问作者Hawkzey

