< Summary

Information
Class: ArturRios.Util.WebApi.Security.Factories.AuthenticatedUserFactory
Assembly: ArturRios.Util.WebApi
File(s): D:\Repositories\dotnet-webapi-util\src\Security\Factories\AuthenticatedUserFactory.cs
Line coverage
84%
Covered lines: 11
Uncovered lines: 2
Coverable lines: 13
Total lines: 42
Line coverage: 84.6%
Branch coverage
66%
Covered branches: 8
Total branches: 12
Branch coverage: 66.6%
Method coverage
100%
Covered methods: 2
Fully covered methods: 1
Total methods: 2
Method coverage: 100%
Full method coverage: 50%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
FromToken(...)66.66%131283.33%

File(s)

D:\Repositories\dotnet-webapi-util\src\Security\Factories\AuthenticatedUserFactory.cs

#LineLine coverage
 1using System.IdentityModel.Tokens.Jwt;
 2using ArturRios.Util.WebApi.Security.Constants;
 3using ArturRios.Util.WebApi.Security.Records;
 4
 5namespace ArturRios.Util.WebApi.Security.Factories;
 6
 7/// <summary>
 8/// Reconstructs an <see cref="AuthenticatedUser"/> from the claims embedded in a JSON Web Token,
 9/// without hitting any data store. Callers must validate the token's signature before trusting the result.
 10/// </summary>
 11public static class AuthenticatedUserFactory
 12{
 113    private static readonly JwtSecurityTokenHandler Handler = new();
 14
 15    /// <summary>
 16    /// Builds an <see cref="AuthenticatedUser"/> from the token's <c>id</c> and <c>role</c> claims.
 17    /// </summary>
 18    /// <param name="token">The JWT to read. Its signature is not validated here.</param>
 19    /// <returns>
 20    /// The reconstructed user, or <see langword="null"/> if the token cannot be read or is missing a
 21    /// numeric <c>id</c> or <c>role</c> claim.
 22    /// </returns>
 23    public static AuthenticatedUser? FromToken(string token)
 724    {
 725        if (string.IsNullOrWhiteSpace(token) || !Handler.CanReadToken(token))
 226        {
 227            return null;
 28        }
 29
 530        var claims = Handler.ReadJwtToken(token).Claims.ToArray();
 31
 1032        var idClaim = claims.FirstOrDefault(claim => claim.Type == TokenClaimKeys.Id)?.Value;
 1533        var roleClaim = claims.FirstOrDefault(claim => claim.Type == TokenClaimKeys.Role)?.Value;
 34
 535        if (!int.TryParse(idClaim, out var id) || !int.TryParse(roleClaim, out var role))
 036        {
 037            return null;
 38        }
 39
 540        return new AuthenticatedUser(id, role);
 741    }
 42}

Methods/Properties

.cctor()
FromToken(System.String)