我们有一个Angular / TypeScript应用程序,该应用程序使用SignalR Web套接字技术连接到我们的C#.NET Core API。为了进行身份验证,我们将发送JWT访问令牌,然后可以检索该令牌并检查API。实际上,这很好。
但是,问题是Web套接字JavaScript客户端最初用于连接到API的方法公开了我们在GET请求中的访问令牌。 Web服务器访问日志,负载平衡器访问日志,代理日志和其他常见的企业工具(例如性能分析平台)可以存储HTTP GET方法请求的敏感信息。下面是我们用于连接的代码。
在前端:
this._hubConnection = new HubConnectionBuilder()
.withUrl(this.apiPath + ?authtoken=${localStorage.getItem('access_token')})
.build();
在后端:
if (context.Request.Path.Value.StartsWith("/hub") &&
context.Request.Query.TryGetValue("authtoken", out
Microsoft.Extensions.Primitives.StringValues token))
{
context.Token = token;
}
这会将我们的访问令牌直接扔到GET请求的查询字符串中,以供所有人查看。
我们尝试了其他解决方案(如下),但仍然存在相同的问题。 Here是一个链接,指向某人的解释,其中解释了Web socket JavaScript客户端当前不支持自定义标头。有什么办法解决这个问题?我们需要发送访问令牌,而不会使其暴露于危险之中。
this._hubConnection = new HubConnectionBuilder()
.withUrl(this.apiPath, { accessTokenFactory: () => localStorage.getItem('access_token') })
.build();