在我的解决方案中,我有2个项目:SignalRServer和WebClient,它们都是MVC应用程序。在我的服务器中,我使用了SignalR 2集线器,在客户端项目中,我使用了jquery SignalR库来通过将托管服务器的URL作为集线器连接URL来连接到集线器服务器。
一切正常,客户端可以从服务器接收消息。
问题:在客户端项目中,我添加了身份验证,用户必须输入用户名和密码才能查看将要查看消息的页面。现在,我想获取已登录到SignalR Hub Server的登录用户名,并使用该用户名将相关消息发送给每个用户。
在与服务器项目分离的客户端项目中进行身份验证时,如何知道哪个用户已连接到服务器?
jQuery客户端中心:
var PbxHub = $.connection.pbxhub;
$.connection.hub.url = "http://localhost:10437/signalr";
$.connection.hub.logging = true;
$.connection.hub.start({
jsonp: true,
withCredentials: false
}).done(function () {
console.log('Hub is connected.');
});
$.connection.hub.disconnected(function () {
console.log('Hub is disconnected.');
setTimeout(function () {
$.connection.hub.start();
}, 1500); // Restart connection after 1500 miliseconds.
});
客户端启动:
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Home/Login"),
});
}
服务器启动:
public void Configuration(IAppBuilder app)
{
app.Map("/signalr", map =>
{
var hubConfiguration = new HubConfiguration
{
EnableJavaScriptProxies = true,
EnableJSONP = true,
EnableDetailedErrors = true
};
map.UseCors(CorsOptions.AllowAll);
map.RunSignalR(hubConfiguration);
});
}
感谢任何想法。
如此处的Microsoft文档所述https://docs.microsoft.com/zh-cn/aspnet/core/signalr/authn-and-authz?view=aspnetcore-3.1#cookie-authentication
在基于浏览器的应用程序中,cookie身份验证允许您现有的用户凭据自动流到SignalR连接。使用浏览器客户端时,不需要其他配置。如果用户登录到您的应用,SignalR连接将自动继承此身份验证。
因此,通过使用与客户端应用程序中相同的DBContext,我可以访问连接到集线器的用户的connectionId,并且在向他们发送消息后将记录插入数据库中。
if (_context.Extension.Any(ex=>ex.Code.ToString() == deviceName))
{
extensionID = _context.Extension.SingleOrDefault(ex => ex.Code.ToString() == deviceName).ID.ToString();
}
else { return; }
asterHub.Clients.User(extensionID).SendState(
e.Device_state.Name,
string.Format("{0}:{1}:{2}",
pc.GetHour(DateTime.Now),
pc.GetMinute(DateTime.Now),
pc.GetSecond(DateTime.Now)),
state,
stateCode);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句