У меня есть консольный клиент. net, вызывающий мой концентратор SignalR. Хаб работает как веб-API, и мне нужно добавить к нему авторизацию. Итак, мой клиент вызывает IdentityServer и добавляет AccessTokenProvider следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("http://localhost:53965/Notify", options =>
{
options.AccessTokenProvider = () => Task.FromResult(tokenResponse.AccessToken);
}
)
.Build();
В настройке концентратора на сервере у меня есть этот код, который я использовал, следуя документам Microsoft:
services.AddControllers();
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.Audience = "notification";
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(path.StartsWithSegments("/Notify")))
{
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
});
Наконец, я сопоставляю свои конечные точки в configure при запуске следующим образом:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<NotificationHub>("/Notify");
});
Когда я просматриваю свой код для консольного клиента и попадаю в JwtBearderEvents OnMessageReceived, путь показывает «/ Notify /gotiate» затем выдает ошибку «Код состояния ответа не указывает на успех: 401 (неавторизованный) и останавливается как для консоли, так и для веб-приложения. Когда я останавливаюсь в JwtBearerEvents, он не показывает accessToken от клиента.