Menghubungkan ke hub SignalR dari konsol menggunakan ClaimsPrincial

Saya memiliki hub SignalR yang sangat sederhana yang aktif dan berjalan di server saya. Menggunakan contoh dari Micorsoft, saya membuat penyimpanan dalam memori untuk memetakan pengguna dari ClaimsPrincipal ke kamus dalam memori. Ini kodenya:

 public class NotificationHub : Hub
{
    private readonly static ConnectionMapping<string> _connections = new ConnectionMapping<string>();
    
    public void SendNotification(string who, NotificationData message)
    {
        string name = Context.User.Identity.Name;
        foreach(var connectionId in _connections.GetConnections(who))
        {
            Clients.Client(connectionId).SendAsync("Notification", message);
        }
    }

    public override Task OnConnectedAsync()
    {
        
        string name = Context.UserIdentifier;
        _connections.Add(name, Context.ConnectionId);
        return base.OnConnectedAsync();
    }

    public override Task OnDisconnectedAsync(System.Exception exception)
    {
        string name = Context.User.Identity.Name;
        _connections.Remove(name, Context.ConnectionId);
        return base.OnDisconnectedAsync(exception);
    }
}

Saya ingin menguji ini dengan aplikasi konsol, tetapi saya tidak dapat menemukan cara membuat ClaimsPrincipal di aplikasi konsol inti .net. Ini kode aplikasi konsol saya:

class Program
{
    static async Task Main(string[] args)
    {

        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
        Console.WriteLine("Press a key to start listening");
        Console.ReadKey();

        Console.WriteLine("Client Listening!");
        var connection = new HubConnectionBuilder()
           .WithUrl("https://localhost:44375/Notify")
           .WithAutomaticReconnect(new[] { TimeSpan.Zero, TimeSpan.Zero, TimeSpan.FromSeconds(10) })
          //.ConfigureLogging(logging =>
          //{
          //    logging.AddConsole();
          //    logging.SetMinimumLevel(LogLevel.Debug);
          //})
           .Build();




        connection.On<NotificationData>("Notification", (notificationData) =>
            Console.WriteLine($"Somebody connected: {notificationData.ClientId}"));

        connection.StartAsync().GetAwaiter().GetResult();
      
        while(Console.ReadKey().Key == ConsoleKey.S)
        {
            var msg = new NotificationData { ClientId = Guid.NewGuid().ToString(), Notifications = null };
            await connection.SendAsync("SendNotification", msg);
            
        }

        
        Console.WriteLine("Listening. Press a key to quit");
        Console.ReadKey();

        connection.Reconnecting += error =>
        {
            Console.WriteLine("Reconnecting...");
            return Task.CompletedTask;
        };
    }
}

Saya mencoba menggunakan WindowsPrincipal tetapi tidak berhasil mengirimkan namanya. Tampaknya SignalR perlu memiliki prinsip klaim. Bagaimana cara mengirimkan klaim utama dari aplikasi konsol?


person john    schedule 12.12.2020    source sumber


Jawaban (1)


Saya dapat membuat objek QueryBuilder untuk mencegat userId dari dokumen JSON yang diposting dan membuat string URI dengan item QueryBuilder ditambahkan. Kemudian pada metode OnConnectedAsync Hub, saya menggunakan metode Context.GetHttpContext untuk menarik pengguna dari string kueri dan menambahkannya ke grup. Saya kemudian memetakannya ke kamus memori untuk memetakan userId ke Context.ConnectionId.

person john    schedule 17.12.2020