61 lines
2.1 KiB
C#
61 lines
2.1 KiB
C#
using Hangfire.Common;
|
|
using Hangfire.Server;
|
|
using Strata.CoreLib.Claims;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
using System.Security.Claims;
|
|
using System.Threading;
|
|
|
|
namespace Strata.RxNorm.Biz.Hangfire
|
|
{
|
|
/// <summary>
|
|
/// Captures Job parameters as Claims on the ThreadPrincipal running the job
|
|
/// </summary>
|
|
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Method)]
|
|
public class CaptureJobParameterAttribute : JobFilterAttribute, IServerFilter
|
|
{
|
|
public int DatabaseGuidArgumentPosition { get; set; } = -1;
|
|
public int StrataIdArgumentPosition { get; set; } = -1;
|
|
|
|
// server filters
|
|
public void OnPerforming(PerformingContext filterContext)
|
|
{
|
|
var claims = new List<Claim>();
|
|
var args = filterContext.BackgroundJob.Job.Args.ToArray();
|
|
|
|
if (StrataIdArgumentPosition >= 0)
|
|
{
|
|
var strataIdValue = string.Format(CultureInfo.CurrentCulture, $"{{{StrataIdArgumentPosition}}}", args);
|
|
if (int.TryParse(strataIdValue, out var strataId))
|
|
{
|
|
claims.Add(new Claim(StrataClaims.StrataId, strataId.ToString()));
|
|
}
|
|
}
|
|
|
|
if (DatabaseGuidArgumentPosition >= 0)
|
|
{
|
|
var databaseGuidValue = string.Format(CultureInfo.CurrentCulture, $"{{{DatabaseGuidArgumentPosition}}}", args);
|
|
if (Guid.TryParse(databaseGuidValue, out var databaseGuid))
|
|
{
|
|
claims.Add(new Claim(StrataClaims.DatabaseGuid, databaseGuid.ToString()));
|
|
}
|
|
}
|
|
|
|
if (claims.Count == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var principal = new ClaimsPrincipal(new ClaimsIdentity(claims, "hangfire_impersonation"));
|
|
Thread.CurrentPrincipal = principal;
|
|
}
|
|
|
|
public void OnPerformed(PerformedContext filterContext)
|
|
{
|
|
Thread.CurrentPrincipal = null;
|
|
}
|
|
}
|
|
}
|