diff --git a/backend/Tnsu.ApprovalRoute.Api/Auth/AuthSetup.cs b/backend/Tnsu.ApprovalRoute.Api/Auth/AuthSetup.cs index 8e0d770..5d82424 100644 --- a/backend/Tnsu.ApprovalRoute.Api/Auth/AuthSetup.cs +++ b/backend/Tnsu.ApprovalRoute.Api/Auth/AuthSetup.cs @@ -58,6 +58,14 @@ public static class AuthSetup { options.Authority = $"https://login.microsoftonline.com/{tenantId}/v2.0"; options.TokenValidationParameters = validationParameters(); + // Без этого JwtBearerHandler переименовывает короткие имена claim'ов + // из токена в длинные ClaimTypes-URI (upn → ClaimTypes.Upn, + // unique_name → ClaimTypes.Name — а НЕ ClaimTypes.Email!) ещё до + // того, как код увидит ClaimsPrincipal. CurrentUserAccessor ищет + // ровно сырые имена ("upn", "unique_name") — с ремаппингом они не + // совпадали ни с чем, и email инициатора не находился вообще + // (не только у токенов без claim'а email, как этот — у ЛЮБЫХ). + options.MapInboundClaims = false; }); services.AddAuthentication() @@ -65,6 +73,7 @@ public static class AuthSetup { options.Authority = $"https://login.microsoftonline.com/{tenantId}/v2.0"; options.TokenValidationParameters = validationParameters(); + options.MapInboundClaims = false; options.Events = new JwtBearerEvents { // Подпись, издатель и аудитория у app-only токена те же, что у