HttpConnectionOptions.AccessTokenProvider не оценивается при каждом запросеC#

Место общения программистов C#
Ответить
Anonymous
 HttpConnectionOptions.AccessTokenProvider не оценивается при каждом запросе

Сообщение Anonymous »

У меня есть следующий тестовый центр SignalR ASP.NET Core (.NET 7):

Код: Выделить всё

public class TestHub : Hub
{
public async Task GetToken()
{
return await Task.FromResult("testtoken");
}

[Authorize]
public async Task Echo(string message)
{
return await Task.FromResult($"Echoing {message}");
}
}
Как видите, я хочу, чтобы клиенты SignalR получали токен из первоначального вызова GetToken, не требующего авторизации, который затем передается (с помощью специальной схемы аутентификации) последовательно звонки для авторизации для них().
Однако это кажется невозможным, если я создам соединение SignalR в клиенте следующим образом:

Код: Выделить всё

string? token = null;

HubConnection connection = new HubConnectionBuilder()
.WithUrl("http://localhost:5100/test", options =>
{
options.AccessTokenProvider = () => Task.FromResult(token);
})
.Build();
await connection.StartAsync();
Отладка показывает, что набор функций для AccessTokenProvider выполняется только при первоначальном запуске соединения, после чего token все еще имеет значение null - так что нет токен когда-либо будет передан для любого вызова. Я ожидал, что функция будет запускаться для каждого запроса (судя по аналогичной функциональности в gRPC).
Это приводит к тому, что первоначальный вызов от клиента завершается успешно, поскольку ему не требуется авторизация, а второй завершается неудачно. :

Код: Выделить всё

token = await connection.InvokeAsync("GetToken"); // fine
string result = await connection.InvokeAsync("Echo", "Hello?"); // fails
Каков предполагаемый способ обновления токена в одном соединении SignalR?
  • Есть ли способ запустить снова функция, установленная для AccessTokenProvider?
  • Могу ли я установить токен вручную в клиенте?
  • Или мне нужно создать отдельный хаб и использовать два соединения: одно только для получения токена, а другое требует токен с самого начала?
(в конце концов мне тоже придется включите эту функцию в клиент C++ SignalR, поэтому, если есть решение и кто-то знает, как добавить его и в клиент C++ SignalR, эта информация тоже очень приветствуется.)

Подробнее здесь: https://stackoverflow.com/questions/791 ... ry-request
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»