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

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响应头,导致浏览器报错、流程终止。

由于无法控制第三方服务器,我希望避免触发预检请求。未登录客户端时无此问题,但生产环境需用户保持登录。请问:

  1. 能否阻止浏览器向重定向页面发送Authorization头?我尝试过OnRedirectToAuthorizationEndpoint但未成功。
  2. 能否将用户会话改为通过Cookie而非Authorization头处理?
  3. 是否有相关官方文档可供参考?直接阅读.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:35:59