У меня есть REST API (ядро 2.1), который должен поддерживать SPA, предоставляя спокойные конечные точки и некоторые интерактивные функции в реальном времени с использованием SignalR;
Маршруты Hub / MVC выполняются на том же сервере, которыйтакже является поставщиком токена JWT.
После входа в систему клиентская сторона получает токен JWT, который помещается в заголовок для каждого запроса REST, в противном случае он получает 401 (это работает с атрибутом [Authorize]
).
На стороне клиента приведенный ниже код пытается подключиться к моей конечной точке / концентратору: new HubConnectionBuilder().withUrl(HUB_URL, { accessTokenFactory: () => this.getToken() })
И если я помещу [Authorize]
в свой класс-концентратор, я получаю следующую ошибку (без авторизации клиентможет отправлять и прослушивать правильно):
Соединение WebSocket с 'wss: // localhost: 5001 / hub? id = MY_ID & access_token = MY_TOKEN' не удалось: ошибка аутентификации HTTP;допустимые учетные данные недоступны
Сервер зарегистрировал неудачные проверки подлинности:
(Запустил console.log в AddJwtBearerOptions.Events.OnMessageReceived)
info: Microsoft.AspNetCore.Hosting.Internal.WebHost [1]
Запрос на запуск HTTP / 1.1 GET https://localhost:5001/hub? id = MY_ID & access_token = MY_TOKEN
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService [2]
Авторизация не удалась.
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler [12]
AuthenticationScheme: вызов на предъявителя.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost [2]
Запрос завершен в 0.3658ms401
В отличие от этих запросов, при использовании ЖЕ ЖЕВЫХ ЖЕТОК с запросами REST (при использовании [Authorize]
) с Header: Bearer XXXX
вместо строки запроса запускается OnTokenValidated
.OnAuthenticationFailed
никогда не запускается, даже если проверка подлинности завершается неудачно:
(Запускает файл console.log в AddJwtBearerOptions.Events.OnMessageReceived)
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Запрос на запуск HTTP / 1.1 GET https://localhost:5001/api/products application / json
(Запускает файл console.log в AddJwtBearerOptions.Events.OnTokenValidated)
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler [2]
Успешно проверил токен.
Проверьте ниже моего ´Startup.cs`
ConfigureServices(IServiceCollection)
services.AddSignalR();
services.AddCors(option => option.AddPolicy("CorsPolicy", p => p.AllowAnyHeader().AllowAnyOrigin().AllowAnyMethod().AllowCredentials()));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.TokenValidationParameters = new TokenValidationParameters{
ValidateIssuer = true,
ValidIssuer = Configuration["JWT:Issuer"],
ValidateLifetime = true,
ValidateAudience = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:SecurityKey"]))
};
});
Configure(IApplicationBuilder)
app.UseAuthentication();
app.UseCors("CorsPolicy");
app.UseHttpsRedirection();
app.UseMvc();
app.UseSignalR(routes => {
routes.MapHub<ApplicationHub>("/hub");
});