Мы добавили аутентификацию на стороне клиента (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]Атрибут Код: Выделить всё
[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);
В некоторых сообщениях упоминается
Код: Выделить всё
OnMessageReceivedЯ реализовал
Код: Выделить всё
OnMessageReceivedКод: Выделить всё
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
Мобильная версия