Как я могу получить информацию о пользователе из токена JWT в ASP.NET Core 8?
Я пишу клиент-серверное приложение с авторизацией JWT в ASP.NET Core 8.
Конечные точки API авторизации реализованы с использованием метода расширения, добавленного в .NET 8.
Проблема в следующем: мне нужно получить информацию о пользователе из тела токена JWT в моем приложении SPA, но конечные точки, добавленныеAddIdentityApi
возвращаются ответы с зашифрованными (сжатыми?) токенами - эти токены не имеют точек в качестве разделителя.
Пример ответа на вход:
{
"tokenType": "Bearer",
"accessToken": "CfDJ8GwmsrOCkNBF ... ", <-- long string without dots
"expiresIn": 3600,
"refreshToken": "..."
}
Раньше я использовал токены JWT в ASP.NET, и они были читаемы.
Я не смог найти уровень в системе аутентификации, который выполняет такое шифрование, и не понимаю, почему он зашифрован. HttpContext.User
авторизованных запросов содержит всю необходимую мне информацию.
МойProgram.cs
:
using ICollector.Server.Data;
using ICollector.Server.Models;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<AppIdentityDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("mssql")
?? throw new InvalidOperationException("Connection string not found.")));
builder.Services.AddIdentityApiEndpoints<AppUser>()
.AddEntityFrameworkStores<AppIdentityDbContext>();
builder.Services.AddAuthorization();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseHttpsRedirection();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapGroup("/api/identity").MapIdentityApi<AppUser>();
app.MapFallbackToFile("/index.html");
app.Run();
Я прочитал эту статью Эндрю Локка, где он описал новый функционал, но не нашел там никаких пояснений по поводу формата токена.
Копаясь в коде фреймворка, я нашел статический классJwtTokenUtilities
, который имеет методDecompressToken(byte[] tokenBytes, string algorithm)
, из чего могу сделать вывод, что сжатие можно выполнить, но сделано ли это в моей конфигурации и в чем алгоритм я так и не понял.