MapBlazorHub使用OIDC授权重定向时抛出空引用异常
问题根因
这两个SignalR相关空引用异常属于Blazor Server场景下触发OIDC授权的无害异常,不影响授权功能本身正常生效,和你的OIDC配置正确性无关。
Blazor Server通过SignalR长连接维护服务端与客户端的Circuit会话上下文,当你直接在页面处理逻辑中调用HttpContext.ChallengeAsync返回302重定向到OIDC授权端点时,服务端会直接中断当前SignalR连接,此时队列中尚未执行完成的JS互操作回调、SignalR消息推送任务找不到可用的客户端代理实例,就会抛出Object reference not set to an instance of an object错误,异常触发时机完全匹配你描述的「重定向至OIDC授权端点时弹出」的特征。
可落地处理方案
- 直接忽略该异常
该异常不会影响业务逻辑、不会导致授权流程失败,仅会在开发环境被调试器捕获。可直接在调试异常设置中过滤该类空引用异常,或在开发环境异常处理中间件中跳过来自Microsoft.AspNetCore.SignalR命名空间、堆栈包含ClientProxyExtensions.SendAsync的异常记录。 - 调整授权触发逻辑,避免在Circuit存活状态下直接返回重定向
不要在Blazor路由对应的页面/组件逻辑中直接调用ChallengeAsync,将授权挑战逻辑迁移到独立的非Blazor端点,让客户端先正常断开SignalR连接后再触发授权跳转:- 新增独立的登录页模型,不需要创建对应视图:
[AllowAnonymous] public class LoginModel : PageModel { public IActionResult OnGet(string redirectUri = "/login-callback") { // 该请求为普通HTTP请求,不绑定Blazor Circuit上下文 return Challenge(new AuthenticationProperties { RedirectUri = redirectUri }, "oidc"); } }
- 在需要触发登录的Blazor组件中,通过导航管理器强制跳转到该登录端点:
@inject NavigationManager NavManager <button @onclick="StartLogin">登录授权</button> @code { private void StartLogin() { // forceLoad: true 会触发全页跳转,先正常释放当前SignalR连接再跳转 NavManager.NavigateTo("/Login", forceLoad: true); } }
- 调整中间件顺序(针对全局授权自动触发挑战的场景)
如果你是通过全局授权过滤器自动触发未授权跳转,需要调整中间件注册顺序,将app.UseAuthorization()放在app.MapBlazorHub()、app.UseBlazorFrameworkFiles()之前,让授权中间件在SignalR连接建立前就完成未授权判断,避免建立Circuit会话后再触发重定向。
内容的提问来源于stack exchange,提问作者HOLz1919
相关产品推荐
相关产品推荐

