Správa uživatelů a skupin v SignalR

Od Předáka Conroye

SignalR umožňuje odesílání zpráv všem připojením přidruženým ke konkrétnímu uživateli a také pojmenovaných skupinám připojení.

Zobrazení nebo stažení ukázkového kódu (stažení)

Uživatelé v SignalR

Jeden uživatel v aplikaci SignalR může mít více připojení k aplikaci. Uživatel může být například připojený na počítači i na telefonu. Každé zařízení má samostatné SignalR připojení, ale všechna jsou přidružená ke stejnému uživateli. Pokud je zpráva odeslána uživateli, obdrží zprávu všechna připojení přidružená k tomuto uživateli. Identifikátor uživatele pro připojení je přístupný Context.UserIdentifier vlastností v centru.

Ve výchozím SignalR nastavení používá z přidružené k připojení jako identifikátor ClaimTypes.NameIdentifier ClaimsPrincipal uživatele. Pokud chcete toto chování přizpůsobit, podívejte se na stránku Použití deklarací identity k přizpůsobení zpracování identit.

Odešlete zprávu konkrétnímu uživateli předáním identifikátoru uživatele do funkce v metodě User centra, jak je znázorněno v následujícím příkladu:

Poznámka

V identifikátoru uživatele se rozlišují malá a velká písmena.

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

Skupiny v SignalR

Skupina je kolekce připojení přidružených k názvu. Zprávy je možné odesílat do všech připojení ve skupině. Skupiny jsou doporučeným způsobem odesílání do připojení nebo více připojení, protože skupiny spravuje aplikace. Připojení může být členem více skupin. Skupiny jsou ideální například pro chatovací aplikaci, kde je možné každou místnost reprezentovat jako skupinu. Připojení se přidávají do skupin nebo se ze skupin odebrali prostřednictvím AddToGroupAsync RemoveFromGroupAsync metod a .

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}.");
}

Členství ve skupině se nezachová, když se připojení znovu připojí. Připojení se musí znovu připojit ke skupině, když se znovu nastane. Členy skupiny není možné spočítat, protože tyto informace nejsou dostupné, pokud se aplikace škáluje na více serverů.

Pokud chcete chránit přístup k prostředkům při používání skupin, použijte funkci ověřování a autorizace v ASP.NET Core. Pokud se uživatel přidá do skupiny jenom v případě, že jsou přihlašovací údaje pro skupinu platné, zprávy odeslané do této skupiny se budou odesílat jenom oprávněným uživatelům. Skupiny ale nejsou funkcí zabezpečení. Deklarace identity ověřování mají funkce, které skupiny ne, například vypršení platnosti a odvolání. Pokud dojde k odvolání oprávnění uživatele pro přístup ke skupině, musí aplikace uživatele ze skupiny explicitně odebrat.

Poznámka

V názvech skupin se rozlišují malá a velká písmena.