经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.net core 3.0 Signalr - 05 使用jwt将用户跟signalr关联
来源:cnblogs  作者:程序有Bug  时间:2019/10/8 9:34:55  对本文有异议

Signalr是以Group、Connect为核心来进行推送,比如,给某个组、某个连接来推送,但实际场景中,核心应该是某个组、某个人;然而一个人可以对应多个连接(浏览器多个tab页);本节就来介绍下自行管理人、组、连接这些关系
由于signalr连接的时候不那么方便附带header和cookie(因为推送独立成一个子系统了),实际实现中采用以url query的形式附带上token,然后服务器端自定义解析token得到用户信息;

服务器端实现

  • ConfigureServices中添加服务相关方法,代码如下,完整代码

    1. public void ConfigureServices(IServiceCollection services)
    2. {
    3. var appSection = Configuration.GetSection("App");
    4. services.Configure<AppSetting>(option => appSection.Bind(option));
    5. var appSetting = appSection.Get<AppSetting>();
    6. services.AddSingleton<SignalrRedisHelper>();
    7. // services.AddHostedService<ClearBackGroundService>();
    8. services.AddAuthentication(options =>
    9. {
    10. options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    11. options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    12. options.DefaultForbidScheme = JwtBearerDefaults.AuthenticationScheme;
    13. })
    14. .AddJwtBearer(option =>
    15. {
    16. option.SecurityTokenValidators.Clear();
    17. option.SecurityTokenValidators.Add(new UserTokenValidation()); ;
    18. option.Events = new JwtBearerEvents()
    19. {
    20. OnMessageReceived = context =>
    21. {
    22. var userId = context.Request.Query["userId"].FirstOrDefault();
    23. if (!string.IsNullOrWhiteSpace(userId))
    24. {
    25. context.Token = userId;
    26. }
    27. return Task.CompletedTask;
    28. }
    29. };
    30. });
    31. services.AddCors(options => options.AddPolicy(corsPolicy, builder =>
    32. {
    33. builder
    34. .SetIsOriginAllowedToAllowWildcardSubdomains()
    35. .WithOrigins(appSetting.CORS.Split(","))
    36. .AllowAnyMethod()
    37. .AllowCredentials()
    38. .AllowAnyHeader()
    39. .Build();
    40. }));
    41. services.AddControllers()
    42. .AddNewtonsoftJson(options => options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver())
    43. .ConfigureApiBehaviorOptions(options =>
    44. {
    45. options.InvalidModelStateResponseFactory = context =>
    46. {
    47. var result = new BadRequestObjectResult(context.ModelState);
    48. result.ContentTypes.Add(MediaTypeNames.Application.Json);
    49. // result.ContentTypes.Add(MediaTypeNames.Application.Xml);
    50. return result;
    51. };
    52. })
    53. .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
    54. // 添加Signalr
    55. services.AddSignalR(config =>
    56. {
    57. if (_webEnv.IsDevelopment())
    58. {
    59. config.EnableDetailedErrors = true;
    60. }
    61. })
    62. // 支持MessagePack
    63. .AddMessagePackProtocol()
    64. // 使用redis做底板 支持横向扩展 Scale-out
    65. .AddStackExchangeRedis(o =>
    66. {
    67. o.ConnectionFactory = async writer =>
    68. {
    69. var config = new ConfigurationOptions
    70. {
    71. AbortOnConnectFail = false,
    72. // Password = "changeme",
    73. ChannelPrefix = "__signalr_",
    74. };
    75. //config.EndPoints.Add(IPAddress.Loopback, 0);
    76. //config.SetDefaultPorts();
    77. config.DefaultDatabase = appSetting.SignalrRedisCache.DatabaseId;
    78. var connection = await ConnectionMultiplexer.ConnectAsync(appSetting.SignalrRedisCache.ConnectionString, writer);
    79. connection.ConnectionFailed += (_, e) =>
    80. {
    81. Console.WriteLine("Connection to Redis failed.");
    82. };
    83. if (connection.IsConnected)
    84. {
    85. Console.WriteLine("connected to Redis.");
    86. }
    87. else
    88. {
    89. Console.WriteLine("Did not connect to Redis");
    90. }
    91. return connection;
    92. };
    93. });
    94. }

    其中,SignalrRedisHelper 为redis辅助方法,详情请参见
    UserTokenValidation 为自定义token解析方法,详情请参见,由于历史遗留问题,此处直接使用了userId,建议的做法是传递jwttoken,然后服务器端解析jwt token得到用户信息

Hub中跟用户关联

在Hub中通过Context.User.Identity.Name可以获取到解析的值,通过这种关系来跟用户关联上,当然,也可以自定义修改使用其他信息,比如Email或其他自定义的名称,具体请google

更多内容请通过快速导航查看下一篇

快速导航

标题 内容
索引 .net core 3.0 Signalr - 实现一个业务推送系统
上一篇 .net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展
下一篇 .net core 3.0 Signalr - 06 业务实现-业务分析
源码地址 源码
官方文档 官方文档

二维码

原文链接:http://www.cnblogs.com/xiexingen/p/11626394.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号