Blazor服务器SignarlR HubConnection StartAsync引发错误



当集线器碰到StartAsync()行时,会抛出以下错误:

JsonReaderException: '<' is an invalid start of a value.

我的猜测是HubConnection得到的是HTML而不是JSON。但是html是什么?如何查看导致HubConnectionStartAsync()上失败的内容?

这是正在运行的完整代码。我可以看到访问令牌,所以我知道它不是空的,我知道它是有效的,因为我可以访问其他[Authorized]页面。

protected override async Task OnInitializedAsync()
{
//create the hub with the url and a token
//configure logging to get better errors
hubConnection = new HubConnectionBuilder()
.WithUrl(
NavigationManager.ToAbsoluteUri("/chathub"), options =>
{
options.AccessTokenProvider = () => Task.FromResult(TokenProvider.AccessToken);
})
.ConfigureLogging(logging => {
logging.AddFilter("Microsoft.AspNetCore.SignalR", LogLevel.Debug);
)
.Build();

//create a listener for any incoming messages
hubConnection.On<ChatMessage>("ReceiveMessage", (message) =>
{
ChatMessages.Add(message);
StateHasChanged();
});
//start the hub and away we go
await hubConnection.StartAsync();
}

这是集线器

namespace territory_lords.Hubs
{
[Authorize]
public class ChatHub : Hub
{
public async Task SendMessage(ChatMessage chatMessage)
{
//just send it to the people who aren't us. We already know about it
await Clients.Others.SendAsync("ReceiveMessage", chatMessage);
}
}
}

这是从启动配置

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseResponseCompression();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
endpoints.MapHub<ChatHub>("/chathub");
});
}

这是一个措辞糟糕的身份验证错误。我希望SignalR知道它在做什么,这样它就可以告诉你发送了什么身份验证,以及为什么响应出乎意料。

您的AddAuthentication为空,我不确定您要使用哪种方法。我将展示一个利用协商的示例,该示例将允许使用本地用户帐户进行本地AD身份验证。这有利于内部部署开发。如果你在做云计算,那么你需要传递AzureAD令牌,这是一个完全不同的蠕虫。

我为SignalR打开了一些更详细的日志记录,它正在谈论谈判。

Microsoft.AspNetCore.Http.Connections.Client.HttpConnection|无法启动连接。从<!获取协商响应时出错;!集线器名称>

所以我在集线器项目中安装了一个NuGet包:Microsoft.AspNetCore.Authentication.Negotiate

然后我添加了一个服务配置,以允许在我的集线器启动中进行协商:

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
.AddNegotiate();

现在,当客户端请求协商时,他们可以神奇地传递本地用户并使用您的本地域进行身份验证。

相关阅读:https://learn.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-6.0&tabs=visual studio

相关内容

  • 没有找到相关文章

最新更新