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

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连接后再触发授权跳转:
    1. 新增独立的登录页模型,不需要创建对应视图:
[AllowAnonymous]
public class LoginModel : PageModel
{
    public IActionResult OnGet(string redirectUri = "/login-callback")
    {
        // 该请求为普通HTTP请求,不绑定Blazor Circuit上下文
        return Challenge(new AuthenticationProperties
        {
            RedirectUri = redirectUri
        }, "oidc");
    }
}
  1. 在需要触发登录的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:25:17