/// <summary> /// Adds a number of <see cref="Claim"/> to the <see cref="JwtPayload"/> as JSON { name, value } pairs. /// </summary> /// <param name="claims">For each <see cref="Claim"/> a JSON pair { 'Claim.Type', 'Claim.Value' } is added. If duplicate claims are found then a { 'Claim.Type', List<object> } will be created to contain the duplicate values.</param> /// <remarks> /// <para>Any <see cref="Claim"/> in the <see cref="IEnumerable{Claim}"/> that is null, will be ignored.</para></remarks> /// <exception cref="ArgumentNullException"><paramref name="claims"/> is null.</exception> public void AddClaims(IEnumerable <Claim> claims) { if (claims == null) { throw LogHelper.LogExceptionMessage(new ArgumentNullException(nameof(claims))); } foreach (Claim claim in claims) { if (claim == null) { continue; } string jsonClaimType = claim.Type; object jsonClaimValue = claim.ValueType.Equals(ClaimValueTypes.String) ? claim.Value : TokenUtilities.GetClaimValueUsingValueType(claim); object existingValue; // If there is an existing value, append to it. // What to do if the 'ClaimValueType' is not the same. if (TryGetValue(jsonClaimType, out existingValue)) { IList <object> claimValues = existingValue as IList <object>; if (claimValues == null) { claimValues = new List <object>(); claimValues.Add(existingValue); this[jsonClaimType] = claimValues; } claimValues.Add(jsonClaimValue); } else { this[jsonClaimType] = jsonClaimValue; } } }