首页 > 解决方案 > 由于 Azure ADB2C,Blazor Server SignalR 集线器在 StartAsync 上失败

问题描述

为了开始学习 Blazor 和一些更新的技术,我创建了一个 Blazor 服务器应用程序。我跟着微软的集线器聊天教程一起学习。事情很顺利。然后我添加了一些基本的 cookie 身份验证,事情还在继续。然后,我遵循了 Carl Franklin 在 Blazor Train 上关于将应用程序连接到 Azure AD B2C 的教程。它可以工作,除了应用程序的聊天中心部分。该应用程序的所有其他部分都可以正常工作并显示用户的信息。

我几乎可以肯定它"hubconnection"失败了,因为它没有进行身份验证,因为它没有获得访问令牌。失败发生在await hubConnection.StartAsync();与错误有关的行上System.Text.Json.JsonReaderException: '<' is an invalid start of a value。我很确定 HTML 会返回 403 消息或类似的消息。

所以我想我在技术上有两个问题:

  1. 如何查看value导致HubConnectionBuilder错误的原因?即使我设置了断点,我也永远看不到导致它阻塞的值是什么。

  2. 如何将访问令牌传递给 HubConnectionBuilder?

我发现了很多“方法”来做到这一点,这些方法要么已经过时,要么我无法工作:

使用已弃用的 AddAzureADB2CBearer

将参数传递给我无法工作的应用程序

适用于 Azure AD,而不是 B2C

这就是使用 Cookie 身份验证的方法:

    hubConnection = new HubConnectionBuilder()
    .WithUrl(
        NavigationManager.ToAbsoluteUri("/chathub"),
                config => config.UseDefaultCredentials = true)
    .Build();

现在看来我需要根据这个关于 Auth 和 SignalR 的 Microsoft 页面传递一个访问令牌,但是

hubConnection = new HubConnectionBuilder()
    .WithUrl(
            NavigationManager.ToAbsoluteUri("/chathub"), options =>
            {
                options.AccessTokenProvider = () => Task.FromResult(_myAccessToken);
            })
    .Build();

这是我在 Startup 中所做的,以根据Carl Franklin YouTube 视频让 B2C 工作

//****Azure B2C****//
        services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
                .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAdB2C"));
        

        services.AddControllersWithViews()
                .AddMicrosoftIdentityUI();

        services.AddAuthorization(options =>
        {
            // By default, all incoming requests will be authorized according to the default policy
            options.FallbackPolicy = options.DefaultPolicy;
        });

        services.AddRazorPages();
        services.AddServerSideBlazor()
                .AddMicrosoftIdentityConsentHandler();

标签: signalrazure-ad-b2caccess-tokenblazor-server-sidesignalr-hub

解决方案


推荐阅读