gpt4 book ai didi

SignalR 在对某些用户使用 WebSockets 或 ServerSentEvents 时给出 404,但对其他用户则不

转载 作者:行者123 更新时间:2023-12-05 06:10:53 25 4
gpt4 key购买 nike

SignalR 在尝试连接某些用户时给我 404。除了 access_token 之外,URL 是相同的。

每个用户都稳定可复现(我的意思是有些用户稳定 OK,有些用户稳定 404)。

access_token 解析的 jwt diff(左边是 OK 用户,右边是 404): access_token parsed jwt diff


我做了一个跟踪级别的日志,接下来是:对于 OK 用户: TRACE console.log for OK user

对于收到 404 的用户: TRACE console.log for 404 user

注意:黑色方 block 下的 URL 是相同的。


前端是 Angular 9 包 "@microsoft/signalr": "^3.1.8",下面是建立连接的代码:

  private buildHub(): HubConnection {
console.log(this.authService.accessToken);
let builder = new HubConnectionBuilder()
.withAutomaticReconnect()
.configureLogging(LogLevel.Information)
.withUrl('ws/notificationHub', {
accessTokenFactory: () => this.authService.accessToken
});

if (this.debugMode) {
builder = builder.configureLogging(LogLevel.Trace);
}

return builder.build();
}

后端正在使用 Startup 中的下一个代码来配置 signalR hub:

public void ConfigureServices(IServiceCollection services) 中:

services.AddSignalR()
.AddJsonProtocol(options =>
{
options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver();
});

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 中:

app.UseSignalR(route =>
{
route.MapHub<NotificationHub>("/ws/notificationHub");
});

我们还使用自定义身份验证,因此我们为 Hub 类设置了 Authorize 属性:

    [Authorize]
public class NotificationHub: Hub<INotificationHubClient>

public void ConfigureServices(IServiceCollection services) 中的这段代码:

services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = identityServerSettings.Url;
options.Audience = identityServerSettings.ApiScopeName;
options.RequireHttpsMetadata = identityServerSettings.RequireHttpsMetadata;

options.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/ws"))
{
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
});

不幸的是,我无法完全访问可重现的环境,但我可以请求查看任何设置或尝试进行一些更改。

我还能尝试什么来解决问题?


更新:协商对双方用户都没有问题。

最佳答案

我的 JWT 大小增加后,最近遇到了这个问题。我发现在我的案例中,IIS 引发了 404 错误,因为查询字符串超过了 2048 的限制。增加查询字符串最大长度后,我的问题得到解决。

关于SignalR 在对某些用户使用 WebSockets 或 ServerSentEvents 时给出 404,但对其他用户则不,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64207084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com