Blazor WASM中如何避免带Authorization头的CORS预检请求?
问题描述
我正在开发基于Blazor WASM的C# Web应用,用户通过Azure AD登录,当前认证配置如下:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(...)
该配置运行正常,浏览器会携带含Bearer令牌的HTTP Authorization请求头,应用中间件可正常解析。现需为客户端配置三方OAuth连接,以代表用户在第三方服务器执行操作,使用Microsoft.AspNetCore.Authentication.OAuth中间件:
services.AddAuthentication(...) .AddCookie() .AddOAuth(...);
流程初期正常,浏览器会重定向到第三方服务器的OAuth授权URL,但触发了CORS流程,浏览器发送OPTIONS预检请求,请求头如下:
OPTIONS /oauth2/auth?client_id=123abc[...] Accept: */* Access-Control-Request-Method: GET Access-Control-Request-Headers: authorization Origin: https://localhost:7260
Firefox和Chrome都会尝试将我方Authorization头发送至第三方服务器,但该服务器无法正确响应,仅重定向到/home且未返回所需CORS响应头,导致浏览器报错、流程终止。
由于无法控制第三方服务器,我希望避免触发预检请求。未登录客户端时无此问题,但生产环境需用户保持登录。请问:
- 能否阻止浏览器向重定向页面发送Authorization头?我尝试过
OnRedirectToAuthorizationEndpoint但未成功。 - 能否将用户会话改为通过Cookie而非Authorization头处理?
- 是否有相关官方文档可供参考?直接阅读.NET源码效率较低。
解决方案
1. 阻止浏览器向第三方授权URL发送Authorization头
可以通过两种方式实现:
- 调整OAuth重定向逻辑:在
OnRedirectToAuthorizationEndpoint回调中,确保重定向请求不携带凭据。修改OAuth配置如下:
.AddOAuth("ThirdParty", options => { // 其他必填配置(ClientId、ClientSecret等) options.Events = new OAuthEvents { OnRedirectToAuthorizationEndpoint = context => { // 直接返回重定向响应,浏览器默认不会携带跨域凭据 context.Response.Redirect(context.RedirectUri); context.HandleResponse(); return Task.CompletedTask; } }; })
- 前端重定向时添加Referrer策略:在Blazor WASM中触发OAuth登录时,用
NavigationManager指定不携带引用信息,避免浏览器发送Authorization头:
navigationManager.NavigateTo("/signin-thirdparty", forceLoad: true, new NavigationOptions { ReferrerPolicy = ReferrerPolicy.NoReferrer });
2. 切换为Cookie会话替代Authorization头
完全可行,Cookie会话遵循同源策略,跨域重定向到第三方服务器时不会被携带,自然不会触发CORS预检。修改认证配置如下:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.SameSite = SameSiteMode.Lax; // 可根据需求添加过期时间、路径等配置 }) .AddMicrosoftIdentityWebApp(options => { Configuration.Bind("AzureAd", options); // 验证Azure AD令牌后创建Cookie会话 options.Events.OnTokenValidated = context => Task.CompletedTask; }) .AddOAuth("ThirdParty", options => { // 第三方OAuth的ClientId、ClientSecret、CallbackPath等配置 });
用户登录Azure AD后,会话由Cookie维护,重定向到第三方授权页时不会携带跨域Cookie,完美规避CORS问题。
3. 相关官方文档参考
- .NET官方文档中
Microsoft.AspNetCore.Authentication.OAuth模块的配置说明,重点查看Events回调的使用场景。 - .NET Cookie认证官方文档,了解Cookie会话的管理机制与同源策略特性。
- Microsoft Identity Web官方文档,参考Azure AD与Cookie认证结合的配置示例。
内容的提问来源于stack exchange,提问作者Rolf Staflin
相关产品推荐
相关产品推荐

