идентичность основного сигнала asp.net - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть клиентское приложение uwp, которое должно выполнить следующие 3 сценария для функции чата.

  1. общаться со всеми, кто подключен к сигнальному концентратору R (общедоступный)
  2. общаться с MyGroupтолько: каждый пользователь будет частью группы.
  3. приватный чат (чат 1 на 1 с другими пользователями)

У меня есть следующий код концентратора, где я каким-то образом могу сделать публичную и групповую функцию.

public class ChatHub : Hub
{
    public Task SendPrivateTweet(string user, string message)
    {
        return Clients.User(user).SendAsync("ReceiveTweet", user, message);
    }

    public async Task SendTweet(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveTweet", user, message);
    }


    public async Task SendTweetGroup(string groupName, string user, string message)
    {
        await Clients.Group(groupName).SendAsync("ReceiveTweet", user, message);
    }

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

        await Clients.Group(groupName).SendAsync("EnteredOrLeft", $"{user} has joined the group {groupName}.");
    }

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

        await Clients.Group(groupName).SendAsync("EnteredOrLeft", $"{user} has left the group {groupName}.");
    }
}

У меня есть база данных с информацией о пользователях, и у каждого пользователя есть имя группы, связанное с ним, на основании того, что я добавляю каждое соединение в соответствующую группу.

await hubConnection.InvokeAsync("AddToGroup", user.Name, user.GroupName);

Я должен сделать это, потому что у меня нет пользователей, вошедших в signalR, поэтому я не могу сопоставить их userIds с тем, что есть в моей базе данных, и именно поэтому я не могу отправить личное сообщение определенному пользователю, потому что для этого контекста должна быть информация о пользователечто в данный момент этого не происходит, в соответствии с документацией происходит сложная работа с носителями токенов, и я не знаю API для всплывающего входа Microsoft для пользователя (чтобыть идеальным).

Есть ли другой способ, как я могу сохранить идентификаторы пользователя в концентраторе, чтобы я мог легко отправить личное сообщение от клиента, отправив идентификатор пользователя получателя?

Iзначит, я могу назначить идентификатор пользователя для каждого соединения во время подключения к концентратору?который в дальнейшем можно будет использовать для запросов в хабе?

Я вижу, как сделать идентификацию в веб-приложении, но не могу найти учебник для того, чтобы сделать то же самое в нативном приложении, таком как uwp: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-2.2&tabs=visual-studio

1 Ответ

0 голосов
/ 28 февраля 2019

Вам необходимо сохранить ConnectionId с вашими пользовательскими именами.Найден как Context.ConnectionId.Вам придется обрабатывать подключение и отключение, потому что идентификатор будет меняться между сессиями.

Здесь есть пример.Не беспокойтесь о Identity.Вы можете использовать свои собственные идентификаторы, хранящиеся в базе данных.Я предполагаю, что поскольку никто не входит в систему, вы не беспокоитесь о людях, притворяющихся кем-то другим.

https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections#inmemory

Если честно, ваш вопрос сбивает с толку.Я предполагаю, что вы заставляете пользователей вводить свое имя в диалоговом окне при каждом подключении, верно?Затем просто сохраните ConnectionId.

...