Mengelola pengguna dan grup di SignalR

Oleh Brennan Conroy

SignalR memungkinkan pesan dikirim ke semua koneksi yang terkait dengan pengguna tertentu dan ke grup koneksi bernama.

Menampilkan atau mengunduh kode sampel (cara mengunduh)

Pengguna di SignalR

Satu pengguna di SignalR dapat memiliki beberapa koneksi ke aplikasi. Misalnya, pengguna dapat terhubung di desktop serta ponsel mereka. Setiap perangkat memiliki koneksi terpisah SignalR , tetapi semuanya terkait dengan pengguna yang sama. Jika pesan dikirim ke pengguna, semua koneksi yang terkait dengan pengguna tersebut menerima pesan. Pengidentifikasi pengguna untuk koneksi dapat diakses oleh Context.UserIdentifier properti di hub.

Secara default, SignalR menggunakan ClaimTypes.NameIdentifier dari yang ClaimsPrincipal terkait dengan koneksi sebagai pengidentifikasi pengguna. Untuk menyesuaikan perilaku ini, lihat Menggunakan klaim untuk menyesuaikan penanganan identitas.

Kirim pesan ke pengguna tertentu dengan meneruskan pengidentifikasi pengguna ke User fungsi dalam metode hub, seperti yang ditunjukkan dalam contoh berikut:

Catatan

Pengidentifikasi pengguna peka huruf besar/kecil.

public Task SendPrivateMessage(string user, string message)
{
    return Clients.User(user).SendAsync("ReceiveMessage", message);
}

Grup dalam SignalR

Grup adalah kumpulan koneksi yang terkait dengan nama. Pesan dapat dikirim ke semua koneksi dalam grup. Grup adalah cara yang disarankan untuk mengirim ke koneksi atau beberapa koneksi karena grup dikelola oleh aplikasi. Koneksi dapat menjadi anggota dari beberapa grup. Grup sangat ideal untuk sesuatu seperti aplikasi obrolan, di mana setiap ruangan dapat direpresentasikan sebagai grup.

Menambahkan atau menghapus koneksi dari grup

Koneksi ditambahkan ke atau dihapus dari grup melalui AddToGroupAsync metode dan RemoveFromGroupAsync :

public async Task AddToGroup(string groupName)
{
    await Groups.AddToGroupAsync(Context.ConnectionId, groupName);

    await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
}

public async Task RemoveFromGroup(string groupName)
{
    await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);

    await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
}

Aman untuk menambahkan pengguna ke grup beberapa kali, tidak terkecuali jika pengguna sudah ada di grup.

Keanggotaan grup tidak dipertahankan saat koneksi tersambung kembali. Koneksi perlu bergabung kembali dengan grup saat dibuat ulang. Tidak dimungkinkan untuk menghitung anggota grup, karena informasi ini tidak tersedia jika aplikasi diskalakan ke beberapa server.

Grup disimpan dalam memori, sehingga tidak akan bertahan melalui restart server. Pertimbangkan layanan Azure SignalR untuk skenario yang mengharuskan keanggotaan grup dipertahankan. Untuk informasi selengkapnya, lihat Azure SignalR

Untuk melindungi akses ke sumber daya saat menggunakan grup, gunakan fungsionalitas autentikasi dan otorisasi di ASP.NET Core. Jika pengguna ditambahkan ke grup hanya saat kredensial valid untuk grup tersebut, pesan yang dikirim ke grup tersebut hanya akan masuk ke pengguna yang berwenang. Namun, grup bukan fitur keamanan. Klaim autentikasi memiliki fitur yang tidak dimiliki grup, seperti kedaluwarsa dan pencabutan. Jika izin pengguna untuk mengakses grup dicabut, aplikasi harus menghapus pengguna dari grup secara eksplisit.

Catatan

Nama grup peka huruf besar/kecil.

Sumber Daya Tambahan: