C# 具有标识的Blazor WebAssembly的信号器集线器授权

C# 具有标识的Blazor WebAssembly的信号器集线器授权,c#,asp.net-core,signalr,blazor,C#,Asp.net Core,Signalr,Blazor,我已经使用JWT身份验证设置了SignalR Blazor WebAssembly应用程序,配置为通过查询字段访问令牌发送令牌 在服务器上,我看到它正在根据这个值分配context.Token 但是,对于带有[Authorize(AuthenticationSchemes=JwtBearerDefaults.AuthenticationScheme)]注释的中心,我得到了401 为什么不授权 这是集线器的代码: 这是我在Startup.cs中看到的: 这位是客户: 这适用于集线器上具有[Auth

我已经使用JWT身份验证设置了SignalR Blazor WebAssembly应用程序,配置为通过查询字段访问令牌发送令牌

在服务器上,我看到它正在根据这个值分配context.Token

但是,对于带有[Authorize(AuthenticationSchemes=JwtBearerDefaults.AuthenticationScheme)]注释的中心,我得到了401

为什么不授权

这是集线器的代码:

这是我在Startup.cs中看到的:

这位是客户:

这适用于集线器上具有[Authorize]属性的WebAssembly自托管身份服务器(使用承载令牌…)

重要的是配置函数以在集线器启动时获取令牌。集线器连接可以使用发送访问令牌所需的任何传输机制

 hubConnection = new HubConnectionBuilder()
            .WithUrl(NavigationManager.ToAbsoluteUri("/chathub"), options =>
            {
                options.AccessTokenProvider = async () =>
                {
                    var accessTokenResult = await AccessTokenProvider.RequestAccessToken();
                    accessTokenResult.TryGetToken(out var accessToken);
                    return accessToken.Value;
                };
            })
            .Build();
我改编自3.1信号器教程的整页

@using Microsoft.AspNetCore.SignalR.Client
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using Microsoft.AspNetCore.Authorization

@page "/chat"
@attribute [Authorize]
@implements IDisposable

<div class="form-group">
    <label>
        User:
        <input @bind="userInput" />
    </label>
</div>
<div class="form-group">
    <label>
        Message:
        <input @bind="messageInput" size="50" />
    </label>
</div>
<button @onclick="Send" disabled="@(!IsConnected)">Send</button>

<hr>

<ul id="messagesList">
    @foreach (var message in messages)
    {
        <li>@message</li>
    }
</ul>

@code {
    private HubConnection hubConnection;
    private List<string> messages = new List<string>();
    private string userInput;
    private string messageInput;

    [Inject]
    public NavigationManager NavigationManager { get; set; }

    [Inject]
    public IAccessTokenProvider AccessTokenProvider { get; set; }

    protected override async Task OnInitializedAsync()
    {

        hubConnection = new HubConnectionBuilder()
            .WithUrl(NavigationManager.ToAbsoluteUri("/chathub"), options =>
            {
                options.AccessTokenProvider = async () =>
                {
                    var accessTokenResult = await AccessTokenProvider.RequestAccessToken();
                    accessTokenResult.TryGetToken(out var accessToken);
                    return accessToken.Value;
                };
            })
            .Build();

        hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
        {
            var encodedMsg = $"{user}: {message}";
            messages.Add(encodedMsg);
            StateHasChanged();
        });

        await hubConnection.StartAsync();
    }

    Task Send() =>
        hubConnection.SendAsync("SendMessage", userInput, messageInput);

    public bool IsConnected =>
        hubConnection.State == HubConnectionState.Connected;

    public void Dispose()
    {
        _ = hubConnection.DisposeAsync();
    }
}
在Startup.cs中,将其更改回模板

services.AddAuthentication()
                  .AddIdentityServerJwt();
然后在你的中心上[授权]


您的代码

您是否尝试过使用
[Authorize(AuthenticationSchemes=“Bearer”)]
?我不确定这里的具体问题是什么,但您应该切换到使用AccessTokenProvider,而不是手动创建查询字符串<代码>变量连接=新建HubConnectionBuilder()。带URL(“https://example.com/chathub,options=>{options.AccessTokenProvider=()=>Task.FromResult(_myAccessToken);}).Build()
services.AddAuthentication()
                  .AddIdentityServerJwt();