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í identity zpracování.
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í 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.