diff --git a/src/OpenIddict.Abstractions/Primitives/OpenIddictExtensions.cs b/src/OpenIddict.Abstractions/Primitives/OpenIddictExtensions.cs index 8b6ab97a..717c6fc7 100644 --- a/src/OpenIddict.Abstractions/Primitives/OpenIddictExtensions.cs +++ b/src/OpenIddict.Abstractions/Primitives/OpenIddictExtensions.cs @@ -958,6 +958,140 @@ public static class OpenIddictExtensions return principal; } + /// + /// Adds a claim to a given identity. + /// + /// The identity. + /// The type associated with the claim. + /// The value associated with the claim. + public static ClaimsIdentity AddClaim(this ClaimsIdentity identity, string type, bool value) + => identity.AddClaim(type, value, ClaimsIdentity.DefaultIssuer); + + /// + /// Adds a claim to a given principal. + /// + /// The principal. + /// The type associated with the claim. + /// The value associated with the claim. + public static ClaimsPrincipal AddClaim(this ClaimsPrincipal principal, string type, bool value) + => principal.AddClaim(type, value, ClaimsIdentity.DefaultIssuer); + + /// + /// Adds a claim to a given identity. + /// + /// The identity. + /// The type associated with the claim. + /// The value associated with the claim. + /// The issuer associated with the claim. + public static ClaimsIdentity AddClaim(this ClaimsIdentity identity, string type, bool value, string issuer) + { + if (identity is null) + { + throw new ArgumentNullException(nameof(identity)); + } + + if (string.IsNullOrEmpty(type)) + { + throw new ArgumentException(SR.GetResourceString(SR.ID0184), nameof(type)); + } + + identity.AddClaim(new Claim(type, value.ToString(), ClaimValueTypes.Boolean, issuer, issuer, identity)); + return identity; + } + + /// + /// Adds a claim to a given principal. + /// + /// The principal. + /// The type associated with the claim. + /// The value associated with the claim. + /// The issuer associated with the claim. + public static ClaimsPrincipal AddClaim(this ClaimsPrincipal principal, string type, bool value, string issuer) + { + if (principal is null) + { + throw new ArgumentNullException(nameof(principal)); + } + + if (principal.Identity is not ClaimsIdentity identity) + { + throw new ArgumentException(SR.GetResourceString(SR.ID0286), nameof(principal)); + } + + identity.AddClaim(type, value, issuer); + return principal; + } + + /// + /// Adds a claim to a given identity. + /// + /// The identity. + /// The type associated with the claim. + /// The value associated with the claim. + public static ClaimsIdentity AddClaim(this ClaimsIdentity identity, string type, long value) + => identity.AddClaim(type, value, ClaimsIdentity.DefaultIssuer); + + /// + /// Adds a claim to a given principal. + /// + /// The principal. + /// The type associated with the claim. + /// The value associated with the claim. + public static ClaimsPrincipal AddClaim(this ClaimsPrincipal principal, string type, long value) + => principal.AddClaim(type, value, ClaimsIdentity.DefaultIssuer); + + /// + /// Adds a claim to a given identity. + /// + /// The identity. + /// The type associated with the claim. + /// The value associated with the claim. + /// The issuer associated with the claim. + public static ClaimsIdentity AddClaim(this ClaimsIdentity identity, string type, long value, string issuer) + { + if (identity is null) + { + throw new ArgumentNullException(nameof(identity)); + } + + if (string.IsNullOrEmpty(type)) + { + throw new ArgumentException(SR.GetResourceString(SR.ID0184), nameof(type)); + } + + identity.AddClaim(new Claim(type, value.ToString(CultureInfo.InvariantCulture), + ClaimValueTypes.Integer64, issuer, issuer, identity)); + return identity; + } + + /// + /// Adds a claim to a given principal. + /// + /// The principal. + /// The type associated with the claim. + /// The value associated with the claim. + /// The issuer associated with the claim. + public static ClaimsPrincipal AddClaim(this ClaimsPrincipal principal, string type, long value, string issuer) + { + if (principal is null) + { + throw new ArgumentNullException(nameof(principal)); + } + + if (principal.Identity is not ClaimsIdentity identity) + { + throw new ArgumentException(SR.GetResourceString(SR.ID0286), nameof(principal)); + } + + if (string.IsNullOrEmpty(type)) + { + throw new ArgumentException(SR.GetResourceString(SR.ID0184), nameof(type)); + } + + identity.AddClaim(type, value, issuer); + return principal; + } + /// /// Adds a claim to a given identity. /// @@ -1588,6 +1722,166 @@ public static class OpenIddictExtensions return principal; } + /// + /// Sets the claim value corresponding to the given type. + /// + /// The identity. + /// The type associated with the claim. + /// The value associated with the claim. + /// The claims identity. + public static ClaimsIdentity SetClaim(this ClaimsIdentity identity, string type, bool? value) + => identity.SetClaim(type, value, ClaimsIdentity.DefaultIssuer); + + /// + /// Sets the claim value corresponding to the given type. + /// + /// The principal. + /// The type associated with the claim. + /// The value associated with the claim. + /// The claims identity. + public static ClaimsPrincipal SetClaim(this ClaimsPrincipal principal, string type, bool? value) + => principal.SetClaim(type, value, ClaimsIdentity.DefaultIssuer); + + /// + /// Sets the claim value corresponding to the given type. + /// + /// The identity. + /// The type associated with the claim. + /// The value associated with the claim. + /// The issuer associated with the claim. + /// The claims identity. + public static ClaimsIdentity SetClaim(this ClaimsIdentity identity, string type, bool? value, string issuer) + { + if (identity is null) + { + throw new ArgumentNullException(nameof(identity)); + } + + if (string.IsNullOrEmpty(type)) + { + throw new ArgumentException(SR.GetResourceString(SR.ID0184), nameof(type)); + } + + identity.RemoveClaims(type); + + if (value is not null) + { + identity.AddClaim(type, value.GetValueOrDefault(), issuer); + } + + return identity; + } + + /// + /// Sets the claim value corresponding to the given type. + /// + /// The principal. + /// The type associated with the claim. + /// The value associated with the claim. + /// The issuer associated with the claim. + /// The claims identity. + public static ClaimsPrincipal SetClaim(this ClaimsPrincipal principal, string type, bool? value, string issuer) + { + if (principal is null) + { + throw new ArgumentNullException(nameof(principal)); + } + + if (string.IsNullOrEmpty(type)) + { + throw new ArgumentException(SR.GetResourceString(SR.ID0184), nameof(type)); + } + + principal.RemoveClaims(type); + + if (value is not null) + { + principal.AddClaim(type, value.GetValueOrDefault(), issuer); + } + + return principal; + } + + /// + /// Sets the claim value corresponding to the given type. + /// + /// The identity. + /// The type associated with the claim. + /// The value associated with the claim. + /// The claims identity. + public static ClaimsIdentity SetClaim(this ClaimsIdentity identity, string type, long? value) + => identity.SetClaim(type, value, ClaimsIdentity.DefaultIssuer); + + /// + /// Sets the claim value corresponding to the given type. + /// + /// The principal. + /// The type associated with the claim. + /// The value associated with the claim. + /// The claims identity. + public static ClaimsPrincipal SetClaim(this ClaimsPrincipal principal, string type, long? value) + => principal.SetClaim(type, value, ClaimsIdentity.DefaultIssuer); + + /// + /// Sets the claim value corresponding to the given type. + /// + /// The identity. + /// The type associated with the claim. + /// The value associated with the claim. + /// The issuer associated with the claim. + /// The claims identity. + public static ClaimsIdentity SetClaim(this ClaimsIdentity identity, string type, long? value, string issuer) + { + if (identity is null) + { + throw new ArgumentNullException(nameof(identity)); + } + + if (string.IsNullOrEmpty(type)) + { + throw new ArgumentException(SR.GetResourceString(SR.ID0184), nameof(type)); + } + + identity.RemoveClaims(type); + + if (value is not null) + { + identity.AddClaim(type, value.GetValueOrDefault(), issuer); + } + + return identity; + } + + /// + /// Sets the claim value corresponding to the given type. + /// + /// The principal. + /// The type associated with the claim. + /// The value associated with the claim. + /// The issuer associated with the claim. + /// The claims identity. + public static ClaimsPrincipal SetClaim(this ClaimsPrincipal principal, string type, long? value, string issuer) + { + if (principal is null) + { + throw new ArgumentNullException(nameof(principal)); + } + + if (string.IsNullOrEmpty(type)) + { + throw new ArgumentException(SR.GetResourceString(SR.ID0184), nameof(type)); + } + + principal.RemoveClaims(type); + + if (value is not null) + { + principal.AddClaim(type, value.GetValueOrDefault(), issuer); + } + + return principal; + } + /// /// Sets the claim value corresponding to the given type. /// @@ -2735,7 +3029,7 @@ public static class OpenIddictExtensions /// The access token lifetime to store. /// The claims identity. public static ClaimsIdentity SetAccessTokenLifetime(this ClaimsIdentity identity, TimeSpan? lifetime) - => identity.SetClaim(Claims.Private.AccessTokenLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => identity.SetClaim(Claims.Private.AccessTokenLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the access token lifetime associated with the claims principal. @@ -2744,7 +3038,7 @@ public static class OpenIddictExtensions /// The access token lifetime to store. /// The claims principal. public static ClaimsPrincipal SetAccessTokenLifetime(this ClaimsPrincipal principal, TimeSpan? lifetime) - => principal.SetClaim(Claims.Private.AccessTokenLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => principal.SetClaim(Claims.Private.AccessTokenLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the authorization code lifetime associated with the claims identity. @@ -2753,7 +3047,7 @@ public static class OpenIddictExtensions /// The authorization code lifetime to store. /// The claims identity. public static ClaimsIdentity SetAuthorizationCodeLifetime(this ClaimsIdentity identity, TimeSpan? lifetime) - => identity.SetClaim(Claims.Private.AuthorizationCodeLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => identity.SetClaim(Claims.Private.AuthorizationCodeLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the authorization code lifetime associated with the claims principal. @@ -2762,7 +3056,7 @@ public static class OpenIddictExtensions /// The authorization code lifetime to store. /// The claims principal. public static ClaimsPrincipal SetAuthorizationCodeLifetime(this ClaimsPrincipal principal, TimeSpan? lifetime) - => principal.SetClaim(Claims.Private.AuthorizationCodeLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => principal.SetClaim(Claims.Private.AuthorizationCodeLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the device code lifetime associated with the claims identity. @@ -2771,7 +3065,7 @@ public static class OpenIddictExtensions /// The device code lifetime to store. /// The claims identity. public static ClaimsIdentity SetDeviceCodeLifetime(this ClaimsIdentity identity, TimeSpan? lifetime) - => identity.SetClaim(Claims.Private.DeviceCodeLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => identity.SetClaim(Claims.Private.DeviceCodeLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the device code lifetime associated with the claims principal. @@ -2780,7 +3074,7 @@ public static class OpenIddictExtensions /// The device code lifetime to store. /// The claims principal. public static ClaimsPrincipal SetDeviceCodeLifetime(this ClaimsPrincipal principal, TimeSpan? lifetime) - => principal.SetClaim(Claims.Private.DeviceCodeLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => principal.SetClaim(Claims.Private.DeviceCodeLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the identity token lifetime associated with the claims identity. @@ -2789,7 +3083,7 @@ public static class OpenIddictExtensions /// The identity token lifetime to store. /// The claims identity. public static ClaimsIdentity SetIdentityTokenLifetime(this ClaimsIdentity identity, TimeSpan? lifetime) - => identity.SetClaim(Claims.Private.IdentityTokenLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => identity.SetClaim(Claims.Private.IdentityTokenLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the identity token lifetime associated with the claims principal. @@ -2798,7 +3092,7 @@ public static class OpenIddictExtensions /// The identity token lifetime to store. /// The claims principal. public static ClaimsPrincipal SetIdentityTokenLifetime(this ClaimsPrincipal principal, TimeSpan? lifetime) - => principal.SetClaim(Claims.Private.IdentityTokenLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => principal.SetClaim(Claims.Private.IdentityTokenLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the refresh token lifetime associated with the claims identity. @@ -2807,7 +3101,7 @@ public static class OpenIddictExtensions /// The refresh token lifetime to store. /// The claims identity. public static ClaimsIdentity SetRefreshTokenLifetime(this ClaimsIdentity identity, TimeSpan? lifetime) - => identity.SetClaim(Claims.Private.RefreshTokenLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => identity.SetClaim(Claims.Private.RefreshTokenLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the refresh token lifetime associated with the claims principal. @@ -2816,7 +3110,7 @@ public static class OpenIddictExtensions /// The refresh token lifetime to store. /// The claims principal. public static ClaimsPrincipal SetRefreshTokenLifetime(this ClaimsPrincipal principal, TimeSpan? lifetime) - => principal.SetClaim(Claims.Private.RefreshTokenLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => principal.SetClaim(Claims.Private.RefreshTokenLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the state token lifetime associated with the claims identity. @@ -2825,7 +3119,7 @@ public static class OpenIddictExtensions /// The state token lifetime to store. /// The claims identity. public static ClaimsIdentity SetStateTokenLifetime(this ClaimsIdentity identity, TimeSpan? lifetime) - => identity.SetClaim(Claims.Private.StateTokenLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => identity.SetClaim(Claims.Private.StateTokenLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the state token lifetime associated with the claims principal. @@ -2834,7 +3128,7 @@ public static class OpenIddictExtensions /// The state token lifetime to store. /// The claims principal. public static ClaimsPrincipal SetStateTokenLifetime(this ClaimsPrincipal principal, TimeSpan? lifetime) - => principal.SetClaim(Claims.Private.StateTokenLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => principal.SetClaim(Claims.Private.StateTokenLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the user code lifetime associated with the claims identity. @@ -2843,7 +3137,7 @@ public static class OpenIddictExtensions /// The user code lifetime to store. /// The claims identity. public static ClaimsIdentity SetUserCodeLifetime(this ClaimsIdentity identity, TimeSpan? lifetime) - => identity.SetClaim(Claims.Private.UserCodeLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => identity.SetClaim(Claims.Private.UserCodeLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the user code lifetime associated with the claims principal. @@ -2852,7 +3146,7 @@ public static class OpenIddictExtensions /// The user code lifetime to store. /// The claims principal. public static ClaimsPrincipal SetUserCodeLifetime(this ClaimsPrincipal principal, TimeSpan? lifetime) - => principal.SetClaim(Claims.Private.UserCodeLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture)); + => principal.SetClaim(Claims.Private.UserCodeLifetime, (long?) lifetime?.TotalSeconds); /// /// Sets the internal authorization identifier associated with the claims identity. diff --git a/test/OpenIddict.Abstractions.Tests/Primitives/OpenIddictExtensionsTests.cs b/test/OpenIddict.Abstractions.Tests/Primitives/OpenIddictExtensionsTests.cs index b21404f7..db47f602 100644 --- a/test/OpenIddict.Abstractions.Tests/Primitives/OpenIddictExtensionsTests.cs +++ b/test/OpenIddict.Abstractions.Tests/Primitives/OpenIddictExtensionsTests.cs @@ -1671,6 +1671,192 @@ public class OpenIddictExtensionsTests Assert.Equal("Bob le Bricoleur", principal.FindFirst(Claims.Name)!.Value); } + [Fact] + public void ClaimsIdentity_AddClaimWithBoolean_ThrowsAnExceptionForNullIdentity() + { + // Arrange + var identity = (ClaimsIdentity) null!; + + // Act and assert + var exception = Assert.Throws(() => identity.AddClaim(Claims.Name, true)); + + Assert.Equal("identity", exception.ParamName); + } + + [Fact] + public void ClaimsPrincipal_AddClaimWithBoolean_ThrowsAnExceptionForNullPrincipal() + { + // Arrange + var principal = (ClaimsPrincipal) null!; + + // Act and assert + var exception = Assert.Throws(() => principal.AddClaim(Claims.Name, true)); + + Assert.Equal("principal", exception.ParamName); + } + + [Fact] + public void ClaimsPrincipal_AddClaimWithBoolean_ThrowsAnExceptionForNullIdentity() + { + // Arrange + var principal = new ClaimsPrincipal(); + + // Act and assert + var exception = Assert.Throws(() => principal.AddClaim(Claims.Name, true)); + + Assert.Equal("principal", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0286), exception.Message); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void ClaimsIdentity_AddClaimWithBoolean_ThrowsAnExceptionForNullOrEmptyType(string type) + { + // Arrange + var identity = new ClaimsIdentity(); + + // Act and assert + var exception = Assert.Throws(() => identity.AddClaim(type, true)); + + Assert.Equal("type", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0184), exception.Message); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void ClaimsPrincipal_AddClaimWithBoolean_ThrowsAnExceptionForNullOrEmptyType(string type) + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + + // Act and assert + var exception = Assert.Throws(() => principal.AddClaim(type, true)); + + Assert.Equal("type", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0184), exception.Message); + } + + [Fact] + public void ClaimsIdentity_AddClaimWithBoolean_AddsExpectedClaim() + { + // Arrange + var identity = new ClaimsIdentity(); + + // Act + identity.AddClaim(Claims.Name, true); + + // Assert + Assert.Equal(bool.TrueString, identity.FindFirst(Claims.Name)!.Value); + } + + [Fact] + public void ClaimsPrincipal_AddClaimWithBoolean_AddsExpectedClaim() + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + + // Act + principal.AddClaim(Claims.Name, true); + + // Assert + Assert.Equal(bool.TrueString, principal.FindFirst(Claims.Name)!.Value); + } + + [Fact] + public void ClaimsIdentity_AddClaimWithInteger_ThrowsAnExceptionForNullIdentity() + { + // Arrange + var identity = (ClaimsIdentity) null!; + + // Act and assert + var exception = Assert.Throws(() => identity.AddClaim(Claims.Name, 42L)); + + Assert.Equal("identity", exception.ParamName); + } + + [Fact] + public void ClaimsPrincipal_AddClaimWithInteger_ThrowsAnExceptionForNullPrincipal() + { + // Arrange + var principal = (ClaimsPrincipal) null!; + + // Act and assert + var exception = Assert.Throws(() => principal.AddClaim(Claims.Name, 42L)); + + Assert.Equal("principal", exception.ParamName); + } + + [Fact] + public void ClaimsPrincipal_AddClaimWithInteger_ThrowsAnExceptionForNullIdentity() + { + // Arrange + var principal = new ClaimsPrincipal(); + + // Act and assert + var exception = Assert.Throws(() => principal.AddClaim(Claims.Name, 42L)); + + Assert.Equal("principal", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0286), exception.Message); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void ClaimsIdentity_AddClaimWithInteger_ThrowsAnExceptionForNullOrEmptyType(string type) + { + // Arrange + var identity = new ClaimsIdentity(); + + // Act and assert + var exception = Assert.Throws(() => identity.AddClaim(type, 42L)); + + Assert.Equal("type", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0184), exception.Message); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void ClaimsPrincipal_AddClaimWithInteger_ThrowsAnExceptionForNullOrEmptyType(string type) + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + + // Act and assert + var exception = Assert.Throws(() => principal.AddClaim(type, 42L)); + + Assert.Equal("type", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0184), exception.Message); + } + + [Fact] + public void ClaimsIdentity_AddClaimWithInteger_AddsExpectedClaim() + { + // Arrange + var identity = new ClaimsIdentity(); + + // Act + identity.AddClaim(Claims.Name, 42L); + + // Assert + Assert.Equal("42", identity.FindFirst(Claims.Name)!.Value); + } + + [Fact] + public void ClaimsPrincipal_AddClaimWithInteger_AddsExpectedClaim() + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + + // Act + principal.AddClaim(Claims.Name, 42L); + + // Assert + Assert.Equal("42", principal.FindFirst(Claims.Name)!.Value); + } + [Fact] public void ClaimsIdentity_AddClaimWithDictionary_ThrowsAnExceptionForNullIdentity() { @@ -2683,6 +2869,316 @@ public class OpenIddictExtensionsTests Assert.Null(principal.GetClaim("type")); } + [Fact] + public void ClaimsIdentity_SetClaimWithBoolean_ThrowsAnExceptionForNullIdentity() + { + // Arrange + var identity = (ClaimsIdentity) null!; + + // Act and assert + var exception = Assert.Throws(() => identity.SetClaim("type", true)); + + Assert.Equal("identity", exception.ParamName); + } + + [Fact] + public void ClaimsPrincipal_SetClaimWithBoolean_ThrowsAnExceptionForNullPrincipal() + { + // Arrange + var principal = (ClaimsPrincipal) null!; + + // Act and assert + var exception = Assert.Throws(() => principal.SetClaim("type", true)); + + Assert.Equal("principal", exception.ParamName); + } + + [Fact] + public void ClaimsPrincipal_SetClaimWithBoolean_ThrowsAnExceptionForNullIdentity() + { + // Arrange + var principal = new ClaimsPrincipal(); + + // Act and assert + var exception = Assert.Throws(() => principal.SetClaim("type", true)); + + Assert.Equal("principal", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0286), exception.Message); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void ClaimsIdentity_SetClaimWithBoolean_ThrowsAnExceptionForNullOrEmptyType(string type) + { + // Arrange + var identity = new ClaimsIdentity(); + + // Act and assert + var exception = Assert.Throws(() => identity.SetClaim(type, true)); + + Assert.Equal("type", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0184), exception.Message); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void ClaimsPrincipal_SetClaimWithBoolean_ThrowsAnExceptionForNullOrEmptyType(string type) + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + + // Act and assert + var exception = Assert.Throws(() => principal.SetClaim(type, "value")); + + Assert.Equal("type", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0184), exception.Message); + } + + [Fact] + public void ClaimsIdentity_SetClaimWithBoolean_AddsExpectedClaim() + { + // Arrange + var identity = new ClaimsIdentity(); + identity.AddClaim("type", false); + + // Act + identity.SetClaim("type", true, "issuer"); + + // Assert + var claim = Assert.Single(identity.FindAll("type")); + Assert.Equal(bool.TrueString, claim.Value); + Assert.Equal(ClaimValueTypes.Boolean, claim.ValueType); + Assert.Equal("issuer", claim.Issuer); + } + + [Fact] + public void ClaimsPrincipal_SetClaimWithBoolean_AddsExpectedClaim() + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + principal.AddClaim("type", false); + + // Act + principal.SetClaim("type", true, "issuer"); + + // Assert + var claim = Assert.Single(principal.FindAll("type")); + Assert.Equal(bool.TrueString, claim.Value); + Assert.Equal(ClaimValueTypes.Boolean, claim.ValueType); + Assert.Equal("issuer", claim.Issuer); + } + + [Fact] + public void ClaimsIdentity_SetClaimWithBoolean_IsCaseInsensitive() + { + // Arrange + var identity = new ClaimsIdentity(); + + // Act + identity.SetClaim("TYPE", true); + + // Assert + Assert.Equal(bool.TrueString, identity.GetClaim("type")); + } + + [Fact] + public void ClaimsPrincipal_SetClaimWithBoolean_IsCaseInsensitive() + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + + // Act + principal.SetClaim("TYPE", true); + + // Assert + Assert.Equal(bool.TrueString, principal.GetClaim("type")); + } + + [Fact] + public void ClaimsIdentity_SetClaimWithBoolean_RemovesEmptyClaim() + { + // Arrange + var identity = new ClaimsIdentity(); + identity.AddClaim("type", false); + + // Act + identity.SetClaim("type", (bool?) null); + + // Assert + Assert.Null(identity.GetClaim("type")); + } + + [Fact] + public void ClaimsPrincipal_SetClaimWithBoolean_RemovesEmptyClaim() + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + principal.AddClaim("type", false); + + // Act + principal.SetClaim("type", (bool?) null); + + // Assert + Assert.Null(principal.GetClaim("type")); + } + + [Fact] + public void ClaimsIdentity_SetClaimWithInteger_ThrowsAnExceptionForNullIdentity() + { + // Arrange + var identity = (ClaimsIdentity) null!; + + // Act and assert + var exception = Assert.Throws(() => identity.SetClaim("type", 42L)); + + Assert.Equal("identity", exception.ParamName); + } + + [Fact] + public void ClaimsPrincipal_SetClaimWithInteger_ThrowsAnExceptionForNullPrincipal() + { + // Arrange + var principal = (ClaimsPrincipal) null!; + + // Act and assert + var exception = Assert.Throws(() => principal.SetClaim("type", 42L)); + + Assert.Equal("principal", exception.ParamName); + } + + [Fact] + public void ClaimsPrincipal_SetClaimWithInteger_ThrowsAnExceptionForNullIdentity() + { + // Arrange + var principal = new ClaimsPrincipal(); + + // Act and assert + var exception = Assert.Throws(() => principal.SetClaim("type", 42L)); + + Assert.Equal("principal", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0286), exception.Message); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void ClaimsIdentity_SetClaimWithInteger_ThrowsAnExceptionForNullOrEmptyType(string type) + { + // Arrange + var identity = new ClaimsIdentity(); + + // Act and assert + var exception = Assert.Throws(() => identity.SetClaim(type, 42L)); + + Assert.Equal("type", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0184), exception.Message); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void ClaimsPrincipal_SetClaimWithInteger_ThrowsAnExceptionForNullOrEmptyType(string type) + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + + // Act and assert + var exception = Assert.Throws(() => principal.SetClaim(type, 42L)); + + Assert.Equal("type", exception.ParamName); + Assert.StartsWith(SR.GetResourceString(SR.ID0184), exception.Message); + } + + [Fact] + public void ClaimsIdentity_SetClaimWithInteger_AddsExpectedClaim() + { + // Arrange + var identity = new ClaimsIdentity(); + identity.AddClaim("type", 1L); + + // Act + identity.SetClaim("type", 42L, "issuer"); + + // Assert + var claim = Assert.Single(identity.FindAll("type")); + Assert.Equal("42", claim.Value); + Assert.Equal(ClaimValueTypes.Integer64, claim.ValueType); + Assert.Equal("issuer", claim.Issuer); + } + + [Fact] + public void ClaimsPrincipal_SetClaimWithInteger_AddsExpectedClaim() + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + principal.AddClaim("type", 1L); + + // Act + principal.SetClaim("type", 42L, "issuer"); + + // Assert + var claim = Assert.Single(principal.FindAll("type")); + Assert.Equal("42", claim.Value); + Assert.Equal(ClaimValueTypes.Integer64, claim.ValueType); + Assert.Equal("issuer", claim.Issuer); + } + + [Fact] + public void ClaimsIdentity_SetClaimWithInteger_IsCaseInsensitive() + { + // Arrange + var identity = new ClaimsIdentity(); + + // Act + identity.SetClaim("TYPE", 42L); + + // Assert + Assert.Equal("42", identity.GetClaim("type")); + } + + [Fact] + public void ClaimsPrincipal_SetClaimWithInteger_IsCaseInsensitive() + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + + // Act + principal.SetClaim("TYPE", 42L); + + // Assert + Assert.Equal("42", principal.GetClaim("type")); + } + + [Fact] + public void ClaimsIdentity_SetClaimWithInteger_RemovesEmptyClaim() + { + // Arrange + var identity = new ClaimsIdentity(); + identity.AddClaim("type", 42L); + + // Act + identity.SetClaim("type", (long?) null); + + // Assert + Assert.Null(identity.GetClaim("type")); + } + + [Fact] + public void ClaimsPrincipal_SetClaimWithInteger_RemovesEmptyClaim() + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + principal.AddClaim("type", 42L); + + // Act + principal.SetClaim("type", (long?) null); + + // Assert + Assert.Null(principal.GetClaim("type")); + } + [Fact] public void ClaimsIdentity_SetClaimWithDictionary_ThrowsAnExceptionForNullIdentity() { @@ -3855,7 +4351,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.SetClaim(Claims.Private.AccessTokenLifetime, "2520"); + identity.SetClaim(Claims.Private.AccessTokenLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), identity.GetAccessTokenLifetime()); @@ -3866,7 +4362,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.SetClaim(Claims.Private.AccessTokenLifetime, "2520"); + principal.SetClaim(Claims.Private.AccessTokenLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), principal.GetAccessTokenLifetime()); @@ -3921,7 +4417,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.SetClaim(Claims.Private.AuthorizationCodeLifetime, "2520"); + identity.SetClaim(Claims.Private.AuthorizationCodeLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), identity.GetAuthorizationCodeLifetime()); @@ -3932,7 +4428,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.SetClaim(Claims.Private.AuthorizationCodeLifetime, "2520"); + principal.SetClaim(Claims.Private.AuthorizationCodeLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), principal.GetAuthorizationCodeLifetime()); @@ -3987,7 +4483,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.SetClaim(Claims.Private.DeviceCodeLifetime, "2520"); + identity.SetClaim(Claims.Private.DeviceCodeLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), identity.GetDeviceCodeLifetime()); @@ -3998,7 +4494,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.SetClaim(Claims.Private.DeviceCodeLifetime, "2520"); + principal.SetClaim(Claims.Private.DeviceCodeLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), principal.GetDeviceCodeLifetime()); @@ -4053,7 +4549,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.SetClaim(Claims.Private.IdentityTokenLifetime, "2520"); + identity.SetClaim(Claims.Private.IdentityTokenLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), identity.GetIdentityTokenLifetime()); @@ -4064,7 +4560,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.SetClaim(Claims.Private.IdentityTokenLifetime, "2520"); + principal.SetClaim(Claims.Private.IdentityTokenLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), principal.GetIdentityTokenLifetime()); @@ -4119,7 +4615,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.SetClaim(Claims.Private.RefreshTokenLifetime, "2520"); + identity.SetClaim(Claims.Private.RefreshTokenLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), identity.GetRefreshTokenLifetime()); @@ -4130,7 +4626,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.SetClaim(Claims.Private.RefreshTokenLifetime, "2520"); + principal.SetClaim(Claims.Private.RefreshTokenLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), principal.GetRefreshTokenLifetime()); @@ -4185,7 +4681,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.SetClaim(Claims.Private.StateTokenLifetime, "2520"); + identity.SetClaim(Claims.Private.StateTokenLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), identity.GetStateTokenLifetime()); @@ -4196,7 +4692,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.SetClaim(Claims.Private.StateTokenLifetime, "2520"); + principal.SetClaim(Claims.Private.StateTokenLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), principal.GetStateTokenLifetime()); @@ -4251,7 +4747,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.SetClaim(Claims.Private.UserCodeLifetime, "2520"); + identity.SetClaim(Claims.Private.UserCodeLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), identity.GetUserCodeLifetime()); @@ -4262,7 +4758,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.SetClaim(Claims.Private.UserCodeLifetime, "2520"); + principal.SetClaim(Claims.Private.UserCodeLifetime, 2520); // Act and assert Assert.Equal(TimeSpan.FromMinutes(42), principal.GetUserCodeLifetime()); @@ -5165,7 +5661,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.AddClaim(Claims.Private.AccessTokenLifetime, "2520"); + identity.AddClaim(Claims.Private.AccessTokenLifetime, 2520); // Act identity.SetAccessTokenLifetime(null); @@ -5179,7 +5675,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.AddClaim(Claims.Private.AccessTokenLifetime, "2520"); + principal.AddClaim(Claims.Private.AccessTokenLifetime, 2520); // Act principal.SetAccessTokenLifetime(null); @@ -5243,7 +5739,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.AddClaim(Claims.Private.AuthorizationCodeLifetime, "2520"); + identity.AddClaim(Claims.Private.AuthorizationCodeLifetime, 2520); // Act identity.SetAuthorizationCodeLifetime(null); @@ -5257,7 +5753,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.AddClaim(Claims.Private.AuthorizationCodeLifetime, "2520"); + principal.AddClaim(Claims.Private.AuthorizationCodeLifetime, 2520); // Act principal.SetAuthorizationCodeLifetime(null); @@ -5321,7 +5817,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.AddClaim(Claims.Private.DeviceCodeLifetime, "2520"); + identity.AddClaim(Claims.Private.DeviceCodeLifetime, 2520); // Act identity.SetDeviceCodeLifetime(null); @@ -5335,7 +5831,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.AddClaim(Claims.Private.DeviceCodeLifetime, "2520"); + principal.AddClaim(Claims.Private.DeviceCodeLifetime, 2520); // Act principal.SetDeviceCodeLifetime(null); @@ -5399,7 +5895,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.AddClaim(Claims.Private.IdentityTokenLifetime, "2520"); + identity.AddClaim(Claims.Private.IdentityTokenLifetime, 2520); // Act identity.SetIdentityTokenLifetime(null); @@ -5413,7 +5909,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.AddClaim(Claims.Private.IdentityTokenLifetime, "2520"); + principal.AddClaim(Claims.Private.IdentityTokenLifetime, 2520); // Act principal.SetIdentityTokenLifetime(null); @@ -5477,7 +5973,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.AddClaim(Claims.Private.RefreshTokenLifetime, "2520"); + identity.AddClaim(Claims.Private.RefreshTokenLifetime, 2520); // Act identity.SetRefreshTokenLifetime(null); @@ -5491,7 +5987,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.AddClaim(Claims.Private.RefreshTokenLifetime, "2520"); + principal.AddClaim(Claims.Private.RefreshTokenLifetime, 2520); // Act principal.SetRefreshTokenLifetime(null); @@ -5555,7 +6051,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.AddClaim(Claims.Private.StateTokenLifetime, "2520"); + identity.AddClaim(Claims.Private.StateTokenLifetime, 2520); // Act identity.SetStateTokenLifetime(null); @@ -5569,7 +6065,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.AddClaim(Claims.Private.StateTokenLifetime, "2520"); + principal.AddClaim(Claims.Private.StateTokenLifetime, 2520); // Act principal.SetStateTokenLifetime(null); @@ -5633,7 +6129,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.AddClaim(Claims.Private.UserCodeLifetime, "2520"); + identity.AddClaim(Claims.Private.UserCodeLifetime, 2520); // Act identity.SetUserCodeLifetime(null); @@ -5647,7 +6143,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.AddClaim(Claims.Private.UserCodeLifetime, "2520"); + principal.AddClaim(Claims.Private.UserCodeLifetime, 2520); // Act principal.SetUserCodeLifetime(null); @@ -5713,7 +6209,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.AddClaim(Claims.Private.AuthorizationId, "2520"); + identity.AddClaim(Claims.Private.AuthorizationId, 2520); // Act identity.SetAuthorizationId(value); @@ -5729,7 +6225,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.AddClaim(Claims.Private.AuthorizationId, "2520"); + principal.AddClaim(Claims.Private.AuthorizationId, 2520); // Act principal.SetAuthorizationId(value); @@ -5795,7 +6291,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.AddClaim(Claims.Private.TokenId, "2520"); + identity.AddClaim(Claims.Private.TokenId, 2520); // Act identity.SetTokenId(value); @@ -5811,7 +6307,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.AddClaim(Claims.Private.TokenId, "2520"); + principal.AddClaim(Claims.Private.TokenId, 2520); // Act principal.SetTokenId(value); @@ -5877,7 +6373,7 @@ public class OpenIddictExtensionsTests { // Arrange var identity = new ClaimsIdentity(); - identity.AddClaim(Claims.Private.TokenType, "2520"); + identity.AddClaim(Claims.Private.TokenType, 2520); // Act identity.SetTokenType(value); @@ -5893,7 +6389,7 @@ public class OpenIddictExtensionsTests { // Arrange var principal = new ClaimsPrincipal(new ClaimsIdentity()); - principal.AddClaim(Claims.Private.TokenType, "2520"); + principal.AddClaim(Claims.Private.TokenType, 2520); // Act principal.SetTokenType(value);