У меня есть два сервиса aspnet.core.Один для IdentityServer 4 и один для API, используемого клиентами Angular4 +.Концентратор SignalR работает на API.Все решение работает на докере, но это не должно иметь значения (см. Ниже).
Я использую неявный поток аутентификации, который работает безупречно.Приложение NG перенаправляет на страницу входа в IdentityServer, где пользователь входит в систему. После этого браузер перенаправляется обратно в приложение NG с токеном доступа.Затем токен используется для вызова API и создания связи с SignalR.Я думаю, что прочитал все, что доступно (см. Источники ниже).
Поскольку SignalR использует веб-сокеты, которые не поддерживают заголовки, токен должен быть отправлен в строке запроса.Затем на стороне API токен извлекается и устанавливается для запроса так же, как это было в заголовке.Затем токен проверяется, и пользователь авторизуется.
API работает без каких-либо проблем, пользователи получают авторизацию, а заявки могут быть получены на стороне API.Таким образом, с IdentityServer не должно возникнуть никаких проблем, поскольку SignalR не требует специальной настройки.Я прав?
Когда я не использую атрибут [Авторизованный] в концентраторе SignalR, рукопожатие завершается успешно .Вот почему я думаю, что нет ничего плохого в используемой инфраструктуре док-станции и обратном прокси-сервере (прокси настроен на включение веб-сокетов).
Итак, без авторизации SignalR работает.С авторизацией клиент NG получает следующий ответ во время рукопожатия:
Failed to load resource: the server responded with a status of 401
Error: Failed to complete negotiation with the server: Error
Error: Failed to start the connection: Error
Запрос
Request URL: https://publicapi.localhost/context/negotiate?signalr_token=eyJhbGciOiJSUz... (token is truncated for simplicity)
Request Method: POST
Status Code: 401
Remote Address: 127.0.0.1:443
Referrer Policy: no-referrer-when-downgrade
Ответ, который я получаю:
access-control-allow-credentials: true
access-control-allow-origin: http://localhost:4200
content-length: 0
date: Fri, 01 Jun 2018 09:00:41 GMT
server: nginx/1.13.10
status: 401
vary: Origin
www-authenticate: Bearer
Согласнологи, токен успешно проверен.Я могу включить полные журналы, однако я подозреваю, где проблема.Поэтому я включу эту часть здесь:
[09:00:41:0561 Debug] Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler AuthenticationScheme: Identity.Application was not authenticated.
[09:00:41:0564 Debug] Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler AuthenticationScheme: Identity.Application was not authenticated.
Я получаю их в лог-файл, и я не уверен, что это значит.Я включил часть кода в API, где я получаю и извлекаю токен вместе с конфигурацией аутентификации.
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultForbidScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultSignOutScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddIdentityServerAuthentication(options =>
{
options.Authority = "http://identitysrv";
options.RequireHttpsMetadata = false;
options.ApiName = "publicAPI";
options.JwtBearerEvents.OnMessageReceived = context =>
{
if (context.Request.Query.TryGetValue("signalr_token", out StringValues token))
{
context.Options.Authority = "http://identitysrv";
context.Options.Audience = "publicAPI";
context.Token = token;
context.Options.Validate();
}
return Task.CompletedTask;
};
});
Других ошибок, исключений в системе нет.Я могу отладить приложение, и все вроде бы нормально.
Что означают включенные строки журнала?Как я могу отладить то, что происходит во время авторизации?
РЕДАКТИРОВАТЬ: Я почти забыл упомянуть, что я думал, что проблема со схемами аутентификации, поэтому я установил каждую схему наодин, я думаю, был необходим.Однако, к сожалению, это не помогло.
Я немного невежественен, поэтому я ценю любое предложение.Спасибо.
Источники информации:
Передача токена авторизации в SignalR
Защита SignalR с помощью IdentityServer
Документы Microsoft по авторизации SignalR
Еще один вопрос GitHub
Аутентификация против SignalR
Identity.Application не был аутентифицирован