Авторизованный пользователь SingalR не получает ответ ASP .Core 3.1 - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь интегрировать Identity Users с SingalR. Пока что авторизация прошла успешно до подключения к хабу. Проблема в том, что я могу заставить его работать с группами, но, несмотря на работу авторизации, я не могу отправлять напрямую пользователем. Я также попробовал электронную почту вместо уникального идентификатора пользователя, но результаты те же. Хотелось бы узнать ваше мнение. Спасибо.

JWT:

 options.Events = new JwtBearerEvents
 {
      OnMessageReceived = context =>
      {
          var accessToken = context.Request.Query["access_token"];

          if (!string.IsNullOrEmpty(accessToken) &&(context.Request.Path.StartsWithSegments("/feed/get")))
          {
              context.Token = context.Request.Query["access_token"];
          }
          return Task.CompletedTask;
      }
 };

Startup.cs

 app.UseEndpoints(route =>
 {
     route.MapHub<ActivityHub>("/feed/Get");                
 });

Hub

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

public class ActivityHub : Hub
{     
    IAuthService AuthService;
    public ActivityHub(IAuthService authService)
    {
        AuthService = authService;
    }

    public override async Task OnConnectedAsync()
    {

        var user = await AuthService.GetUserByNameAsync(Context.User.Identity.Name);           

        await Clients.User(user.Id).SendAsync("receiveMessage", "Hello user"); //this doesn't get recived on client

        await Groups.AddToGroupAsync(Context.ConnectionId, user.Id);
        await Clients.Group(user.Id).SendAsync("receiveMessage", "Hello group!");//this works

        await base.OnConnectedAsync();

    }

        public override async Task OnDisconnectedAsync(Exception exception)
        {
            await base.OnDisconnectedAsync(exception);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Как я сказал в разделе комментариев, лучший подход - просто использовать группы для архивирования вашей цели. Просто добавьте пользователя в одну группу пользователей по подключенному методу.

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

1 голос
/ 17 июня 2020

Если вы хотите настроить идентификатор пользователя, вы можете реализовать свой собственный IUserIdProvider, как показано в документации. https://docs.microsoft.com/aspnet/core/signalr/authn-and-authz?view=aspnetcore-3.1#use -claims-to-customize-identity-processing

Также, когда используя Clients.User (...), вы должны использовать Context.UserIdentifier для получения идентификатора пользователя, поскольку это то, что SignalR будет использовать для различения guish пользователя.

...