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

Blazor Server应用Azure B2C登录后事件不触发及连接异常问题

问题描述

构建了支持Azure AD与Azure B2C双登录的Blazor Server应用,可通过身份验证方案控制内容展示。Azure AD登录后功能正常,但Azure B2C登录后onclick等交互事件完全无法触发,同时浏览器控制台出现以下错误:

[2022-09-07T12:09:46.429Z] Error: Failed to start the connection: Error
[2022-09-07T12:09:46.430Z] Error: Error
Error: Cannot send data if the connection is not in the 'Connected' State.
    at e.send (https://localhost:5001/_framework/blazor.server.js:1:51662)
    at e.sendMessage (https://localhost:5001/_framework/blazor.server.js:1:22519)
    at e.sendWithProtocol (https://localhost:5001/_framework/blazor.server.js:1:22581)
    at https://localhost:5001/_framework/blazor.server.js:1:23244
    at new Promise (<anonymous>)
    at e.invoke (https://localhost:5001/_framework/blazor.server.js:1:23041)
    at e.<anonymous> (https://localhost:5001/_framework/blazor.server.js:21:27207)
    at https://localhost:5001/_framework/blazor.server.js:21:26507
    at Object.next (https://localhost:5001/_framework/blazor.server.js:21:26612)
    at https://localhost:5001/_framework/blazor.server.js:21:25524

B2C登录后应用与服务器的SignalR连接断开,这是交互事件失效的直接原因。

解决方案

1. 指定Blazor Hub的身份验证方案

多身份验证方案下,SignalR默认可能使用第一个注册的方案(Azure AD),导致B2C登录后无法通过身份验证建立连接。在Program.cs中配置MapBlazorHub时显式指定B2C的认证方案:

app.MapBlazorHub(options =>
{
    // 替换为你的Azure B2C认证方案名称,通常是"AzureADB2C"
    options.AuthenticationSchemes = new[] { "AzureADB2C" };
});

2. 检查B2C的Cookie配置

确保B2C生成的Cookie属性符合SignalR连接要求,避免SameSite或Secure属性导致Cookie无法传递:

services.AddAuthentication()
    .AddAzureADB2C(options =>
    {
        Configuration.Bind("AzureAdB2C", options);
        // 调整Cookie属性
        options.Cookie.SameSite = SameSiteMode.Lax;
        options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        options.Cookie.HttpOnly = true;
    });

3. 验证B2C登录后的用户标识

Blazor Server的SignalR连接依赖稳定的用户身份标识,检查B2C登录后HttpContext.User的核心Claim(如NameIdentifier)是否存在且有效。可以在登录后的页面中添加调试代码确认:

@inject IHttpContextAccessor HttpContextAccessor

<p>User ID: @HttpContextAccessor.HttpContext?.User.FindFirst(ClaimTypes.NameIdentifier)?.Value</p>

如果该Claim缺失,需要在B2C的用户流中配置返回对应的Claim。

4. 确认中间件顺序

确保MapBlazorHub()在身份验证中间件之后执行,正确的中间件顺序应为:

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

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:40:29