React SignalR - 不要在 URL 中发送不记名令牌

Thr*_*yJs 5 signalr reactjs .net-core

我正在编写一个应用程序,但刚刚未通过以下渗透测试:

授权令牌正在 URL 中发送:

 https://domain/Hub?access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Imh1Tjk1SXZQZmVocTM0R3pCRFoxR1hHaXJuTSIsImtpZCI6Imh1Tjk1SXZQZmVocTM0R3pCRFoxR1hHaXJuTSJ9.....
Run Code Online (Sandbox Code Playgroud)

当发送到使用 Azure AD 授权的集线器时,会自动发生这种情况。

    constructor (hub: string) {
    this.hubName = hub;
    this.hub = new HubConnectionBuilder()
        .configureLogging(LogLevel.Critical)
        .withUrl(`${this.hubURL}${hub}` , {
            skipNegotiation: true,
            transport: HttpTransportType.WebSockets,
            accessTokenFactory: () => {
                return `${getToken()}`
            }
        })
        .build();
}
Run Code Online (Sandbox Code Playgroud)

我已经搜索过文档,但是我想知道是否有一种方法可以在不暴露 URL 中的承载令牌的情况下连接和发送请​​求?

Pre*_*hts 3

文档中

使用 WebSocket 或服务器发送事件时,浏览器客户端在查询字符串中发送访问令牌。通过查询字符串接收访问令牌通常与使用标准授权标头一样安全。始终使用 HTTPS 以确保客户端和服务器之间安全的端到端连接。许多 Web 服务器会记录每个请求的 URL,包括查询字符串。记录 URL 可以记录访问令牌。默认情况下,ASP.NET Core 会记录每个请求的 URL,其中将包含查询字符串。例如:

从这个文档中

在标准 Web API 中,不记名令牌在 HTTP 标头中发送。但是,在使用某些传输时,SignalR 无法在浏览器中设置这些标头。使用 WebSocket 和服务器发送事件时,令牌作为查询字符串参数传输。

在我看来,您可以禁用 WebSockets 和服务器发送事件。请参阅此问题,了解如何删除 WebSockets 或服务器发送的事件。但随后您会退回到长轮询或永久框架,您可能不希望这样。

由于您问题中的 URL 是 https,如果您禁用了请求日志记录,我不会太担心。

更改日志级别Microsoft.AspNetCore.Hosting可以在您的appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore.Hosting": "Warning"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)