Správa uživatelů a skupin v SignalR

Autor: Brennan Conroy

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

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

Uživatelé v SignalR

Jeden uživatel 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šechny jsou přidružené ke stejnému uživateli. Pokud se uživateli odešle zpráva, obdrží se zpráva všechna připojení přidružená k danému uživateli. K identifikátoru uživatele pro připojení má vlastnost v centru přístup Context.UserIdentifier .

Ve výchozím nastavení SignalR se jako identifikátor uživatele používá ClaimTypes.NameIdentifier z ClaimsPrincipal přidruženého připojení. Pokud chcete toto chování přizpůsobit, přečtěte si téma Použití deklarací identity k přizpůsobení zpracování identit.

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

Poznámka:

U 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 se dají odesílat všem připojením ve skupině. Skupiny jsou doporučeným způsobem odeslání na připojení nebo více připojení, protože skupiny jsou spravovány aplikací. Připojení může být členem více skupin. Skupiny jsou ideální pro něco jako chatovací aplikace, kde každou místnost lze reprezentovat jako skupinu.

Přidání nebo odebrání připojení ze skupiny

Připojení iony se přidají do skupin nebo se z nich odeberou pomocí AddToGroupAsync metod: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}.");
}

Je bezpečné přidat uživatele do skupiny vícekrát, není vyvolán žádná výjimka v případě, že uživatel již ve skupině existuje.

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

Skupiny se uchovávají v paměti, takže se nebudou uchovávat po restartování serveru. Zvažte službu Azure SignalR pro scénáře, které vyžadují zachování členství ve skupinách. Další informace najdete v Azure . SignalR

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

Poznámka:

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

Další materiály