【问题标题】:SignalR accessTokenFactory doesn't pass token to request query stringSignalR accessTokenFactory 不将令牌传递给请求查询字符串
【发布时间】:2019-09-24 11:18:45
【问题描述】:

我正在尝试通过查询字符串访问 SignalRHub 类上的令牌。 这是客户端代码:

const connection = new signalR.HubConnectionBuilder()
    .withUrl($("#url").val(), {
    skipNegotiation: true,
    transport: signalR.HttpTransportType.WebSockets,
    accessTokenFactory: () => {
       token                                         
    }
  })
  .configureLogging(signalR.LogLevel.Trace)
  .build(); 

Jwt 配置:

OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
var path = context.HttpContext.Request.Path.Value;

if (!string.IsNullOrEmpty(accessToken) && (path.Equals("/websocket"))
{
 context.Token = accessToken;
}
 return Task.CompletedTask;
}

问题是当我向集线器发出请求时,accessToken 为空,即使我通过 accessTokenFactory 传递它也是如此。没有查询字符串参数“access_token”。代码是在docs guide 之后编写的。我已经尝试在启动时更改我的中间件调用但没有解决。

启动文件:

public void ConfigureServices(IServiceCollection services)
{            
   services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
   .AddSessionStateTempDataProvider();

   /*aditional configurations*/

   services.AddSignalR();

   /*more aditional configurations*/

}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
   app.UseCors(options =>
   {
    options.WithExposedHeaders("Location");
    options.AllowAnyOrigin();
    options.AllowAnyHeader();
    options.AllowAnyMethod();
    options.AllowCredentials();
   });

   app.UseSignalR(routes =>
   {
    routes.MapHub<SignalRHub>("/websocket");
   });

   app.UseAuthentication();

   app.UseMvc(routes =>
   {
    routes.MapRoute("api", "{controller}/{action}/{id}");
   });

   /*aditional middlewares*/

   app.UseForwardedHeaders(new ForwardedHeadersOptions
   {
    ForwardedHeaders = ForwardedHeaders.XForwardedFor |          
    ForwardedHeaders.XForwardedProto
   });

}

任何帮助将不胜感激

【问题讨论】:

  • 它必须是accessTokenFactory: () =&gt; { return token } 或只是accessTokenFactory: () =&gt; token
  • 确实是 return 关键字丢失了...我现在感觉非常愚蠢...谢谢!
  • 把它留在这里,让我未来的自己好好笑……关于 SO 的经典第一个问题

标签: c# asp.net-core jwt signalr


【解决方案1】:

看起来您实际上并未在 accessTokenFactory 实现中提供令牌。您需要返回令牌值,否则您的 HubConnection 将无法获取它

accessTokenFactory: () => {
   return token                                         
}

【讨论】:

    猜你喜欢
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多