asp.net core如何在SignalR中获取用户信息(AbpSession)
业务需要在signalR中需要根据User.Id去做数据的过滤,net core在TokenAuthController中集成了登录的功能。但是登录之后,连接signalR,在signalR中直接使用AbpSession.UserId获取到的是null。一直在百度谷歌中查找,结果应该和大家一样,解决方案都是在客户端连接时传递UserId参数,在服务端连接成功的事件OnConnected中将connectionId和userId保存在字典中,用的时候通过connectionId获取userId。
看了官方的文档之后,发现有SignInManager这么一个类,依我的智商,看不懂微软寥寥七八个字介绍的SignInManager是个什么玩意儿。官方就提供了api和参数,跟没写一样。他是ASP.NET用于身份识别的两种cookie。具体是什么大家自行百度。
signalR获取UserId
登录成功之后、在Authenticate返回前使用SignInManager的SignInAsync方法,便可以在SignalR中获取到AbpSession。但是使用此方法后,在层级架构中获取的User.Claims权限会优先使用SignInAsync生成的。这就导致退出登录的时候无法获取有关token的claims的信息,导致登录异常。解决办法就是在前端退出前,先调用后台执行SigInManager.SignOutAsync,再调用LogOut就可以正常退出了。
以上有理解不对的地方,欢迎大佬留言批评