Аутентификация SignalR и AzureAD: свободный веб-сокет в пользу длительного опросаC#

Место общения программистов C#
Ответить
Anonymous
 Аутентификация SignalR и AzureAD: свободный веб-сокет в пользу длительного опроса

Сообщение Anonymous »

Наше приложение ASP.NET Core/React использовало SignalR с хорошей производительностью.

Мы добавили аутентификацию на стороне клиента (React) с помощью MSAL.
Поскольку я добавил аутентификацию AzureAD, согласование соединения SignalR между клиентом и сервером происходит из WebSockets -> ServerSideEvents -> Длительный опрос

При Длинном опросе производительность значительно снижается.
Изображение

На этапе соединения появляется ошибка 401, несмотря на то, что Jwt передается как в виде строки запроса, так и в заголовке.
Вот клиентский код, передающий токен:

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

let optimizerConnection = new HubConnectionBuilder()
.withUrl("/hubpath",
{ accessTokenFactory: () => getRawJwtToken() },
false, // skipNegotiation
HttpTransportType.WebSockets //transport
)
.withAutomaticReconnect()
.configureLogging(LogLevel.Trace)
.build()
Вот концентратор с необходимой аутентификацией (идентификационная информация, утверждения и т. д.) отправляется на сервер с помощью

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

[Authorize]Атрибут 
[/b]. Но аутентификация требует длительного опроса и работает очень медленно:

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

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "Optimizer")]
public class SomeHub : Hub, ISomeHub { ... }
Вот конфигурация сервера идентификации:

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

var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(configuration);
Я прочитал все сообщения, которые нашел на эту тему, иногда с аутентификацией Jwt (не AzureAD).
В некоторых сообщениях упоминается

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

OnMessageReceived
[/b] метод.
Я реализовал

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

OnMessageReceived
[/b], но он не вызывается:

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

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(ConfigureJwtBearerOptions,
ConfigureMicrosoftIdentityOptions,
jwtBearerScheme: "Bearer",
subscribeToJwtBearerMiddlewareDiagnosticsEvents: true);

private static void ConfigureMicrosoftIdentityOptions(MicrosoftIdentityOptions options)
{
options.Authority = "https://login.microsoftonline.com";
options.ClientId = "myClientIdGuid";
options.Instance = "https://login.microsoftonline.com/myInstanceGuid";
}
private static void ConfigureJwtBearerOptions(JwtBearerOptions options)
{
options.Events = new JwtBearerEvents
{
OnChallenge = OnChallenge,
OnTokenValidated = OnTokenValidated,
OnAuthenticationFailed = OnAuthenticationFailed,
OnForbidden = OnForbidden,
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];

// If the request is for our hub...
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(path.StartsWithSegments(SomeHub.Path)))
{
// Read the token out of the query string
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
}
Если кто-нибудь знает, спасибо.

Подробнее здесь: https://stackoverflow.com/questions/777 ... ng-polling
Ответить

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

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

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

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

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