Я пишу приложение для чата в реальном времени с использованием веб-API ASP.NET Core 8, SignalR и Angular. Я использую новую систему аутентификации, представленную в .NET 8, с аутентификацией по токену.
Я реализовал аутентификацию из интерфейса Angular, и она работает правильно, и я получаю доступ к авторизованным методам.
Но когда я пытаюсь аутентифицировать свой чат-центр, он не распознает его как аутентифицированного пользователя.
Кроме того, Context.User?.Identity?.IsAuthenticated отображается как "ЛОЖЬ". Но функция onConnectedAsync оформлена как авторизация и работает.
Это в моем конструкторе службы чата, где я строю соединение:
this.hubConnection = new signalR.HubConnectionBuilder()
.withUrl(`${this.baseUrl}/chathub`, {
accessTokenFactory: () => this.authService.getToken()
})
.build();
Я проверил вкладку «Сеть». Токен доступа отправляется вместе с запросом.
Это мой чат-центр:
[Authorize]
public override async Task OnConnectedAsync()
{
var userId = Context.UserIdentifier; // Get user ID from authentication
await Clients.All.SendAsync("ReceiveSystemMessage", $"{userId} joined.");
await base.OnConnectedAsync();
}
[Authorize]
public override async Task OnDisconnectedAsync(Exception exception)
{
var userId = Context.UserIdentifier; // Get user ID from authentication
await Clients.All.SendAsync("ReceiveSystemMessage", $"{userId} left.");
await base.OnDisconnectedAsync(exception);
}
Он успешно подключается и отправляет сообщения. Но в системном сообщении отображается только «присоединился» без идентификатора.
Это файл program.cs:
// Add Authentication
builder.Services.AddAuthentication().AddBearerToken(IdentityConstants.BearerScheme);
builder.Services.AddAuthorizationBuilder();
builder.Services.AddIdentityCore()
.AddEntityFrameworkStores()
.AddApiEndpoints();
var app = builder.Build();
app.UseCors();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapIdentityApi();
app.MapControllers();
app.MapHub("/chathub");
app.Run();
Подробнее здесь: https://stackoverflow.com/questions/787 ... r-chat-hub