SignalR 和未经身份验证获取用户 ID
SignalR and getting User ID without Authentication
我们正在开发一个使用 SignalR 进行通信的教学网站。
讲师登录并设置指导material,准备就绪后,将发布研讨会 ID,以便用户可以将此值连同用户名输入框中并加入会议。
与会者无需"officially log in",因为他们只是在观看会议。
但是,对于信号 R 组和通信,我必须将车间 ID 和用户名获取到中心。
如何在不让用户创建登录凭据的情况下执行此操作?当 SignalR 代码创建连接时,我只需要将一些参数(workshopID 和用户名)发送到集线器。因为导师必须登录,所以我不想乱用默认行为。
我正在使用 MVC 核心 2.0。
以下代码有效,但我 send/receive 向系统中的每个人发送消息,而不仅仅是目标组:
Java 脚本:
const connection = new signalR.HubConnectionBuilder()
.withUrl("/Workshop")
.build();
//
connection.on("ReceiveMessage", (user, userID, message) => {
const msg = message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
const encodedMsg = user + " says " + msg;
const li = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li);
});
//connection.hub.qs = "Name=John";
connection.start().catch(err => console.error(err.toString()));
夏普:
public override async Task OnConnectedAsync()
{
var test = Context.User.Identity.Name; //Only works if user is signed in
// var test2 = Context.User.FindFirst("WebID").Value;
await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnConnectedAsync();
}
我试过添加声明 (var test2...) 并检索它,但这似乎也不起作用。我也试过使用信号器查询参数....
您可以使用Context.Items在连接范围内存储信息。
因此,您可以在中心执行一个操作,当用户输入他们的姓名时调用该操作,并且该操作将用户名存储在项目中。
该信息在连接期间仍然可用。
public class ChatHub : Hub
{
public void Login(string login)
{
Context.Items["Login"] = login;
}
public async Task SendMessage(string message)
{
await Clients.All.SendAsync(Context.Items["Login"] + "sends the message : " + message);
}
}
我们正在开发一个使用 SignalR 进行通信的教学网站。
讲师登录并设置指导material,准备就绪后,将发布研讨会 ID,以便用户可以将此值连同用户名输入框中并加入会议。
与会者无需"officially log in",因为他们只是在观看会议。
但是,对于信号 R 组和通信,我必须将车间 ID 和用户名获取到中心。
如何在不让用户创建登录凭据的情况下执行此操作?当 SignalR 代码创建连接时,我只需要将一些参数(workshopID 和用户名)发送到集线器。因为导师必须登录,所以我不想乱用默认行为。
我正在使用 MVC 核心 2.0。
以下代码有效,但我 send/receive 向系统中的每个人发送消息,而不仅仅是目标组:
Java 脚本:
const connection = new signalR.HubConnectionBuilder()
.withUrl("/Workshop")
.build();
//
connection.on("ReceiveMessage", (user, userID, message) => {
const msg = message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
const encodedMsg = user + " says " + msg;
const li = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li);
});
//connection.hub.qs = "Name=John";
connection.start().catch(err => console.error(err.toString()));
夏普:
public override async Task OnConnectedAsync()
{
var test = Context.User.Identity.Name; //Only works if user is signed in
// var test2 = Context.User.FindFirst("WebID").Value;
await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnConnectedAsync();
}
我试过添加声明 (var test2...) 并检索它,但这似乎也不起作用。我也试过使用信号器查询参数....
您可以使用Context.Items在连接范围内存储信息。
因此,您可以在中心执行一个操作,当用户输入他们的姓名时调用该操作,并且该操作将用户名存储在项目中。 该信息在连接期间仍然可用。
public class ChatHub : Hub
{
public void Login(string login)
{
Context.Items["Login"] = login;
}
public async Task SendMessage(string message)
{
await Clients.All.SendAsync(Context.Items["Login"] + "sends the message : " + message);
}
}