38 lines
1.9 KiB
C#
38 lines
1.9 KiB
C#
using Microsoft.AspNetCore.Http;
|
||
|
||
namespace Tnsu.ApprovalRoute.Infrastructure.TnsuPortal;
|
||
|
||
/// <summary>
|
||
/// Authorization, с которым идти в api.tnsu.kz в пределах текущей области DI.
|
||
///
|
||
/// Два источника, и второй нужен именно фоновым задачам:
|
||
/// • обрабатывается HTTP-запрос — заголовок берётся прямо из него;
|
||
/// • выполняется задача Hangfire — своего HttpContext'а у неё нет, поэтому
|
||
/// токен инициировавшего пользователя ей передают аргументом и кладут сюда
|
||
/// через <see cref="Set"/> (см. CreateNextListPartitionJob).
|
||
///
|
||
/// Scoped: Hangfire создаёт отдельную область DI на каждое выполнение задачи,
|
||
/// поэтому положенный здесь токен не протекает между задачами.
|
||
/// </summary>
|
||
public sealed class TnsuPortalCallerToken(IHttpContextAccessor httpContextAccessor)
|
||
{
|
||
private string? _explicit;
|
||
|
||
/// <summary>
|
||
/// Заголовок целиком, вида «Bearer …». null — вызывающего токена нет
|
||
/// (тогда авторизация уходит на client_credentials, см. TnsuPortalAuthorizer).
|
||
/// </summary>
|
||
public string? Current
|
||
{
|
||
get
|
||
{
|
||
var incoming = httpContextAccessor.HttpContext?.Request.Headers.Authorization.ToString();
|
||
return string.IsNullOrWhiteSpace(incoming) ? _explicit : incoming;
|
||
}
|
||
}
|
||
|
||
/// <summary>Положить токен явно — для кода без HttpContext (фоновые задачи).</summary>
|
||
public void Set(string? authorization) =>
|
||
_explicit = string.IsNullOrWhiteSpace(authorization) ? null : authorization;
|
||
}
|