Udostępnij za pośrednictwem


Zarządzanie użytkownikami i grupami w programie SignalR

Autor: Brennan Conroy

SignalR umożliwia wysyłanie komunikatów do wszystkich połączeń skojarzonych z określonym użytkownikiem oraz do nazwanych grup połączeń.

Wyświetl lub pobierz przykładowy kod (jak pobrać)

Użytkownicy w SignalR

Jeden użytkownik w SignalR programie może mieć wiele połączeń z aplikacją. Na przykład użytkownik może być połączony na pulpicie, a także na telefonie. Każde urządzenie ma oddzielne SignalR połączenie, ale wszystkie są skojarzone z tym samym użytkownikiem. Jeśli do użytkownika zostanie wysłana wiadomość, wszystkie połączenia skojarzone z tym użytkownikiem otrzymają komunikat. Dostęp do identyfikatora użytkownika dla połączenia można uzyskać za pomocą Context.UserIdentifier właściwości w centrum.

Domyślnie SignalR używa ClaimTypes.NameIdentifier elementu z skojarzonego ClaimsPrincipal z połączeniem jako identyfikatora użytkownika. Aby dostosować to zachowanie, zobacz Dostosowywanie obsługi przy użyciu oświadczeńidentity.

Wyślij komunikat do określonego użytkownika, przekazując identyfikator użytkownika do User funkcji w metodzie centrum, jak pokazano w poniższym przykładzie:

Uwaga

W identyfikatorze użytkownika jest uwzględniana wielkość liter.

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

Grupy w SignalR

Grupa jest kolekcją połączeń skojarzonych z nazwą. Komunikaty mogą być wysyłane do wszystkich połączeń w grupie. Grupy są zalecanym sposobem wysyłania do połączenia lub wielu połączeń, ponieważ grupy są zarządzane przez aplikację. Połączenie może być członkiem wielu grup. Grupy są idealne dla aplikacji czatu, gdzie każde pomieszczenie może być reprezentowane jako grupa.

Dodawanie lub usuwanie połączeń z grupy

Połączenia są dodawane do lub usuwane z grup za pośrednictwem AddToGroupAsync metod i 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}.");
}

Można bezpiecznie dodać użytkownika do grupy wiele razy. W przypadku, gdy użytkownik już istnieje w grupie, nie zostanie zgłoszony wyjątek.

Członkostwo w grupie nie jest zachowywane, gdy połączenie zostanie ponownie nawiązane. Połączenie musi ponownie połączyć się z grupą po jej ponownym ustanowieniu. Nie można zliczyć członków grupy, ponieważ te informacje nie są dostępne, jeśli aplikacja jest skalowana na wiele serwerów.

Grupy są przechowywane w pamięci, więc nie będą utrwalane przez ponowne uruchomienie serwera. Rozważ usługę platformy Azure SignalR dla scenariuszy wymagających utrwalania członkostwa w grupie. Aby uzyskać więcej informacji, zobacz Azure SignalR

Aby chronić dostęp do zasobów podczas korzystania z grup, użyj funkcji uwierzytelniania i autoryzacji w programie ASP.NET Core. Jeśli użytkownik zostanie dodany do grupy tylko wtedy, gdy poświadczenia są prawidłowe dla tej grupy, komunikaty wysyłane do tej grupy będą kierowane tylko do autoryzowanych użytkowników. Jednak grupy nie są funkcją zabezpieczeń. Oświadczenia uwierzytelniania mają funkcje, które nie są grupami, takie jak wygaśnięcie i odwołanie. Jeśli uprawnienie użytkownika do uzyskiwania dostępu do grupy zostanie odwołane, aplikacja musi jawnie usunąć użytkownika z grupy.

Uwaga

W nazwach grup jest rozróżniana wielkość liter.

Dodatkowe zasoby