Соединение SignalR с accessTokenFactory на клиенте JS не соединяется с connectionId и UserIdentifier, но клиент .Net в порядке - PullRequest
0 голосов
/ 25 апреля 2019

В моем прототипе SignalR Authentication у клиента JS нет Context.UserIdentifier, и для соединения будет 0 при подключении к концентратору SignalR на стороне клиента JS.Он отлично работает с клиентом .NET.

Хотите знать, если построение соединения неправильно?Это мое соединение:

state.connection = new signalR.HubConnectionBuilder()
                .withUrl("/chatHub", {
                    accessTokenFactory: async () => {
                        axios.post('https://localhost:44384/api/account/token', { email: email, password: password })
                            .then(async (response) => {
                                if (typeof response === 'undefined') {
                                    return;
                                }
                                else {
                                    console.log(response.data);
                                    console.log(state.connection.id);
                                    return response.data;
                                }
                            })
                            .catch((error) => {
                                console.log(error);
                            });
                    }
                })
                .build();   

Клиент WPF прекрасно подключается с токеном с помощью этого кода:

_connection = new HubConnectionBuilder()
            .WithUrl("https://localhost:44384/ChatHub", options =>
            {
                options.AccessTokenProvider = async () =>
                {
                    var tokenUserCommand = new TokenUserCommand
                    {
                        Email = emailTextBox.Text,
                        Password = passwordBox.Password
                    };

                    var token = await RestService.PostAsync<string>("account/token", tokenUserCommand);
                    return token;
                };

            })
            .Build();

Где я нашел Конфигурация аутентификации SignalR и SignalR Bearer Authentication

Вот источник для моего прототипа проекта

1 Ответ

0 голосов
/ 29 апреля 2019

Клиенту JS, запрашивающему токен, просто нужно ключевое слово await перед axios.post. Такая ошибка новичка, которая заняла больше времени, чем следовало.

state.connection = new signalR.HubConnectionBuilder()
            .withUrl("https://localhost:44384/ChatHub", {
                accessTokenFactory: async () => {
                    if (state.accessToken === null) {
                        await axios.post('https://localhost:44384/api/account/token', { email: email, password: password })
                            .then(async (response) => {
                                if (typeof response === 'undefined') {
                                    return;
                                }
                                else {
                                    state.accessToken = response.data;
                                }
                            })
                            .catch((error) => {
                                console.log(error);
                            });
                    }
                    return state.accessToken;
                }
            })
            .build();
...