Как аутентифицировать мой клиент signalR с помощью IdentityServer 4C#

Место общения программистов C#
Ответить
Anonymous
 Как аутентифицировать мой клиент signalR с помощью IdentityServer 4

Сообщение Anonymous »


В моем клиенте я использую этот код для получения токена: «http://localhost:5006» — это мой IdentityServer (центр сертификации)

var httpClient = новый HttpClient(); var DiscoveryDocument = httpClient.GetDiscoveryDocumentAsync("http://localhost:5006").Result; var tokenResponse = httpClient.RequestClientCredentialsTokenAsync( новый ClientCredentialsTokenRequest { Адрес = DiscoverDocument.TokenEndpoint, ClientId = "клиент", ClientSecret = "Прево100", Область = "prevo100-api" }).Результат; Мой концентратор signalR — http://localhost:5119/Prevo100", я получил это исключение при запуске StartAsync:

System.AggregateException : «Произошла одна или несколько ошибок. (Ответ код состояния не указывает на успех: 403 (Запрещено).)'

У меня тоже может быть ошибка 401!

var url = "http://localhost:5119/Prevo100"; Соединение HubConnection = новый HubConnectionBuilder() .WithUrl(url, options => { options.AccessTokenProvider = () => Task.FromResult(tokenResponse.AccessToken); }) .WithAutomaticReconnect() .Строить(); вар клиент = новый Prevo100WebClient (соединение); соединение.StartAsync().Подождите(); // { options.Authority = "http://localhost:5006"; options.RequireHttpsMetadata = false; options.Audience = "prevo100-api"; options.TokenValidationParameters = новый Microsoft.IdentityModel.Tokens.TokenValidationParameters { Валидатаудиенс = ложь }; // Нам нужно перехватить событие OnMessageReceived, чтобы // разрешаем обработчику аутентификации JWT читать доступ // токен из строки запроса, когда WebSocket или // Поступает запрос событий, отправленных сервером. // Отправка токена доступа в строке запроса требуется при использовании WebSockets или ServerSentEvents // из-за ограничений API браузера. Мы ограничиваем его только вызовами // Концентратор SignalR в этом коде. // См. https://docs.microsoft.com/aspnet/core/ ... en-logging. // для получения дополнительной информации о соображениях безопасности при использовании // строка запроса для передачи токена доступа. options.Events = новый JwtBearerEvents { OnMessageReceived = контекст => { var accessToken = context.Request.Query["access_token"]; // Если запрос для нашего хаба... вар путь = context.HttpContext.Request.Path; if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/Prevo100")) { // Считаем токен из строки запроса context.Token = токен доступа; } вернуть Задача.ЗавершеннаяЗадача; } }; }); Services.AddSignalR(hubOptions => { //hubOptions.ClientTimeoutInterval // 30 секунд по умолчанию }); } public void Настройка (приложение IApplicationBuilder, среда IWebHostEnvironment) { если (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); приложение.UseStaticFiles(); приложение.UseFileServer(); приложение.UseRouting(); приложение.UseAuthentication(); приложение.UseAuthorization(); app.UseEndpoints(конечные точки => { endpoints.MapHub("/Prevo100"); }); } Я добавил атрибут класса концентратора:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] общедоступный класс Prevo100Hub: Hub, IHubContract { //.... }
Ответить

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

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

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

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

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