< Summary

Information
Class: ProjectTemplate.Web.Accessors.HttpContextApplicationAuditContextAccessor
Assembly: ProjectTemplate.Web
File(s): /home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Web/Accessors/HttpContextApplicationAuditContextAccessor.cs
Line coverage
97%
Covered lines: 34
Uncovered lines: 1
Coverable lines: 35
Total lines: 72
Line coverage: 97.1%
Branch coverage
54%
Covered branches: 24
Total branches: 44
Branch coverage: 54.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Current()50%3232100%
GetAuthenticatedClaim(...)66.66%141275%

File(s)

/home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Web/Accessors/HttpContextApplicationAuditContextAccessor.cs

#LineLine coverage
 1using System.Diagnostics;
 2using System.Security.Claims;
 3using ProjectTemplate.Infrastructure.Data.Auditing;
 4using ProjectTemplate.Web.Authentication.Claims;
 5
 6namespace ProjectTemplate.Web.Accessors;
 7
 8/// <summary>
 9/// Resolves structured application audit context from the active HTTP request.
 10/// </summary>
 1411public sealed class HttpContextApplicationAuditContextAccessor(
 1412    IHttpContextAccessor httpContextAccessor)
 13    : IApplicationAuditContextAccessor
 14{
 15    private const string _subjectClaimType = "sub";
 16
 17    public ApplicationAuditContext Current
 18    {
 19        get
 20        {
 421            HttpContext? httpContext = httpContextAccessor.HttpContext;
 422            ClaimsPrincipal? user = httpContext?.User;
 23
 24            // Prefer the normalized application claim: claims transformation may remove the provider claims.
 425            string? subject = GetAuthenticatedClaim(user, ApplicationClaimTypes.Subject)
 426                ?? GetAuthenticatedClaim(user, _subjectClaimType)
 427                ?? GetAuthenticatedClaim(user, ClaimTypes.NameIdentifier);
 28
 429            if (!string.IsNullOrWhiteSpace(subject))
 30            {
 331                return new ApplicationAuditContext(
 332                    subject,
 333                    ApplicationAuditActorTypes.Human,
 334                    subject,
 335                    correlationId: httpContext?.TraceIdentifier,
 336                    traceId: Activity.Current?.TraceId.ToString(),
 337                    spanId: Activity.Current?.SpanId.ToString());
 38            }
 39
 140            string? remoteIp = httpContext?.Connection.RemoteIpAddress?.ToString();
 41
 142            return !string.IsNullOrWhiteSpace(remoteIp)
 143                ? new ApplicationAuditContext(
 144                    remoteIp,
 145                    ApplicationAuditActorTypes.Network,
 146                    $"Remote IP: {remoteIp}",
 147                    correlationId: httpContext?.TraceIdentifier,
 148                    traceId: Activity.Current?.TraceId.ToString(),
 149                    spanId: Activity.Current?.SpanId.ToString())
 150                : new ApplicationAuditContext(
 151                "Unknown",
 152                ApplicationAuditActorTypes.Unknown,
 153                "Unknown",
 154                correlationId: httpContext?.TraceIdentifier,
 155                traceId: Activity.Current?.TraceId.ToString(),
 156                spanId: Activity.Current?.SpanId.ToString());
 57        }
 58    }
 59
 60    private static string? GetAuthenticatedClaim(
 61        ClaimsPrincipal? user,
 62        string claimType)
 63    {
 764        if (user?.Identity?.IsAuthenticated != true)
 65        {
 066            return null;
 67        }
 68
 769        string? value = user.FindFirst(claimType)?.Value?.Trim();
 770        return string.IsNullOrWhiteSpace(value) ? null : value;
 71    }
 72}