Skip to content

Commit 156054c

Browse files
refactor(Core.Application.Pipelines.Authorization): improve role matching logic
1 parent eb5655d commit 156054c

File tree

2 files changed

+13
-11
lines changed

2 files changed

+13
-11
lines changed

src/Core.Application/Pipelines/Authorization/AuthorizationBehavior.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,21 @@ private bool isHasRequiredRole(IEnumerable<string> identityRoles, ReadOnlySpan<c
4040
{
4141
bool isMatch = false;
4242
foreach (var role in identityRoles)
43-
for (int i = 0; i < requiredRoleClaims.Length; ++i)
43+
{
44+
for (int i = 0, j = 0; i < requiredRoleClaims.Length; ++i)
4445
{
45-
if (requiredRoleClaims[i] == ',')
46-
continue;
47-
48-
if (requiredRoleClaims[i] == role[i])
46+
if (requiredRoleClaims[i] == role[j])
47+
{
4948
isMatch = true;
49+
if (j + 1 < role.Length) ++j;
50+
}
5051
else
5152
{
5253
isMatch = false;
53-
break;
54+
j = 0;
5455
}
5556
}
57+
}
5658

5759
return isMatch;
5860
}

src/tests/Core.Application.Tests/Core.Application.Tests/Pipelines/AuthorizationBehaviorTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public async Task Handle_ValidRequest_ReturnsResponse()
2525

2626
public class ValidSecuredRequest : IRequest<int>, ISecuredRequest
2727
{
28-
public IEnumerable<string> IdentityRoles { get; set; }
28+
public IEnumerable<string> IdentityRoles { get; set; } = [];
2929
public ReadOnlySpan<char> RequiredRoleClaims => "".AsSpan();
3030
}
3131

@@ -44,7 +44,7 @@ await Assert.ThrowsAsync<AuthenticationException>(
4444

4545
public class InvalidSecuredRequest : IRequest<int>, ISecuredRequest
4646
{
47-
public IEnumerable<string> IdentityRoles { get; set; }
47+
public IEnumerable<string> IdentityRoles { get; set; } = [];
4848
public ReadOnlySpan<char> RequiredRoleClaims => "".AsSpan();
4949
}
5050

@@ -69,7 +69,7 @@ await Assert.ThrowsAsync<AuthorizationException>(
6969

7070
public class SecuredRequestWithRequiredRoleClaims : IRequest<int>, ISecuredRequest
7171
{
72-
public IEnumerable<string> IdentityRoles { get; set; }
72+
public IEnumerable<string> IdentityRoles { get; set; } = [];
7373
public ReadOnlySpan<char> RequiredRoleClaims => "admin".AsSpan();
7474
}
7575

@@ -94,7 +94,7 @@ public async Task Handle_ValidRequest_WithRequiredRoleClaims_ReturnsResponse()
9494

9595
public class SecuredRequestWithoutRequiredRoleClaims : IRequest<int>, ISecuredRequest
9696
{
97-
public IEnumerable<string> IdentityRoles { get; set; }
98-
public ReadOnlySpan<char> RequiredRoleClaims => "admin".AsSpan();
97+
public IEnumerable<string> IdentityRoles { get; set; } = [];
98+
public ReadOnlySpan<char> RequiredRoleClaims => "editor,admin".AsSpan();
9999
}
100100
}

0 commit comments

Comments
 (0)