SignalR accessTokenFactory 不将令牌传递给请求查询字符串

Posted

技术标签:

【中文标题】SignalR accessTokenFactory 不将令牌传递给请求查询字符串【英文标题】:SignalR accessTokenFactory doesn't pass token to request query string 【发布时间】: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 的经典第一个问题 【参考方案1】:

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

accessTokenFactory: () => 
   return token                                         

【讨论】:

以上是关于SignalR accessTokenFactory 不将令牌传递给请求查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

SignalR系列教程:SignalR快速入门

SignalR学习系列4. SignalR广播程序

SignalR入门之多平台SignalR服务端

SignalR学习系列3. SignalR实时高刷新率程序

将 REST 与 SignalR 混合而不是仅使用 SignalR 的目的是啥? [复制]

快速了解SignalR—在MVA微软虚拟学院学习SignalR