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

Azure中Blazor Cookie认证丢失请求查询参数问题排查

问题:Azure环境下iframe内请求查询参数丢失,本地运行正常

我的应用嵌入在其他应用的iframe中,由宿主应用处理授权并传递认证Cookie,请求格式为https://myapp/resource?clientId=1234&transactionId=12345。两个应用都部署在Azure上,但每次尝试对传入请求进行认证时,请求的查询参数会丢失。本地运行完全正常,但Azure环境下必现该问题。

以下是相关代码:

应用配置代码(Program.cs)

public static void Main(string[] args)
{
    Logger? logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
    logger.Debug("Init main");

    try
    {
        WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
        //logging
        builder.Logging.ClearProviders();
        builder.Host.UseNLog();

        builder.Services.AddAuthentication(options =>
                {
                    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                })
                .AddCookie(options =>
                {
                    options.LoginPath = "/";
                    options.EventsType = typeof(SecureCookieAuthenticationEvents);
                    options.AccessDeniedPath = "/access-denied";
                });

        builder.Services.AddRazorComponents().AddInteractiveServerComponents();
        builder.Services.AddCascadingAuthenticationState();

        builder.Services.AddDbContext<ConfigurationContext>();
        builder.Services.AddHttpContextAccessor();
        builder.Services.AddAuthorizationBuilder()
                .AddPolicy("CookiePolicy", policy =>
                {
                    policy.Requirements.Add(new SecureCookieRequirement());
                });
        builder.Services.AddScoped<IAuthorizationHandler, SecureCookieAuthorizationHandler>();
        .
                .
                .
        builder.Services.AddScoped<SecureCookieAuthenticationEvents>();
        WebApplication app = builder.Build();

        if (!app.Environment.IsDevelopment())
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseMiddleware<CookieAuthenticationMiddleware>();

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseMiddleware<ReverseProxyMiddleware>();
        app.UseAntiforgery();

        app.MapRazorComponents<App>().AddInteractiveServerRenderMode();

        app.Run();
    }
    catch (Exception e)
    {
        logger.Error(e, "Program stopped bue to problem");
        throw;
    }
    finally
    {
        LogManager.Shutdown();
    }
}

CookieAuthenticationMiddleware代码

public async Task Invoke(HttpContext context)
{
    this.logger.LogInformation("incoming claims:");
    foreach (Claim claim in context.User.Claims)
    {
        this.logger.LogInformation($"{claim.Type}:{claim.Value}");
    }
    if (context.User.Identity is { IsAuthenticated: false } || context.User.HasClaim(claim => claim.Type == ClaimTypes.Anonymous))
    {
        string clientId = context.Request.Query["clientId"].FirstOrDefault() ?? "";
        string cookie = context.Request.Cookies["CPFCookie"] ?? "";
        List<Claim> claims = new List<Claim>
                {
                    new Claim("clientId", clientId),
                    new Claim("CPFCookie", cookie),
                    new Claim(ClaimTypes.Name, "SecureUser")
                };

        this.logger.LogInformation("new claims:");
        foreach (Claim claim in claims)
        {
            this.logger.LogInformation($"{claim.Type}:{claim.Value}");
        }
        ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

        await context.SignInAsync(
            CookieAuthenticationDefaults.AuthenticationScheme,
            new ClaimsPrincipal(claimsIdentity)
        );
    }

    await this.next(context);
}

SecureCookieAuthenticationEvents代码

public override async Task SigningIn(CookieSigningInContext context)
{
    ClaimsPrincipal? user = context.Principal;
    if (context.HttpContext.Request.Path.Value == "/_blazor"
        || user is null
        || string.IsNullOrEmpty(user.FindFirstValue("CPFCookie"))
        || string.IsNullOrEmpty(user.FindFirstValue("clientId")))
    {
        List<Claim> ac = new List<Claim>
        {
            new Claim(ClaimTypes.Anonymous, "true")
        };
        ClaimsIdentity anonymous = new(ac, context.Principal?.Identity?.AuthenticationType);
        context.Principal = new ClaimsPrincipal(anonymous);
        return;
    }
    this.logger.LogInformation("SigningIn...");
    bool validated = this.ValidationLogic(context);
    this.logger.LogInformation($"{context.Request.GetDisplayUrl()}");
    this.logger.LogInformation($"{context.HttpContext.Request.Path}");
    IEnumerable<Claim> claims = user.Claims.Append(new Claim("CPFCookieValidated", validated.ToString()));
    ClaimsIdentity identity = new(claims, context.Principal?.Identity?.AuthenticationType);
    context.Principal = new ClaimsPrincipal(identity);
    await base.SigningIn(context);
}

我已经尝试了多种解决方案,当前版本在本地环境运行正常,但Azure环境下问题依然存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:54:56