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
相关产品推荐
相关产品推荐

