aboutsummaryrefslogtreecommitdiff
path: root/src/DevHive.Services/Services
diff options
context:
space:
mode:
authorSyndamia <kamen.d.mladenov@protonmail.com>2020-12-18 14:47:45 +0200
committerSyndamia <kamen.d.mladenov@protonmail.com>2020-12-18 14:47:45 +0200
commit0b7db1681290c6177538900064fa05bb5ef34916 (patch)
tree40bb30dba1014536899e935c60e09534d8c1becd /src/DevHive.Services/Services
parent844ee0cba02d245ba5c8ba77282235066549ce8d (diff)
downloadDevHive-0b7db1681290c6177538900064fa05bb5ef34916.tar
DevHive-0b7db1681290c6177538900064fa05bb5ef34916.tar.gz
DevHive-0b7db1681290c6177538900064fa05bb5ef34916.zip
ValidJWT bypasses username check when user is admin
Diffstat (limited to 'src/DevHive.Services/Services')
-rw-r--r--src/DevHive.Services/Services/UserService.cs25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/DevHive.Services/Services/UserService.cs b/src/DevHive.Services/Services/UserService.cs
index b2d5aee..ea47bdb 100644
--- a/src/DevHive.Services/Services/UserService.cs
+++ b/src/DevHive.Services/Services/UserService.cs
@@ -105,37 +105,34 @@ namespace DevHive.Services.Services
throw new InvalidOperationException("Unable to delete user!");
}
- /// <summary>
- /// Checks wether the given token's UserName and Roles are the same as these of the user with the given id.
- /// </summary>
public async Task<bool> ValidJWT(Guid id, string rawTokenData)
{
// There is authorization name in the beginning, i.e. "Bearer eyJh..."
var jwt = new JwtSecurityTokenHandler().ReadJwtToken(rawTokenData.Remove(0, 7));
+
+ string jwtUserName = this.GetClaimTypeValues("unique_name", jwt.Claims)[0];
+ List<string> jwtRoleNames = this.GetClaimTypeValues("role", jwt.Claims);
- User user = await this._userRepository.GetByIdAsync(id)
+ User user = await this._userRepository.GetByUsername(jwtUserName)
?? throw new ArgumentException("User does not exist!");
-
- /* Check username */
- string jwtUserName = this.GetClaimTypeValues("unique_name", jwt.Claims)[0];
- if (jwtUserName != user.UserName)
- return false;
+ /* Username check, only when user isn't admin */
- /* Check roles */
- List<string> jwtRoleNames = this.GetClaimTypeValues("role", jwt.Claims);
+ if (!jwtRoleNames.Contains(Role.AdminRole))
+ if (!this._userRepository.DoesUserHaveThisUsername(id, jwtUserName))
+ return false;
+ /* Check roles */
+
// Check if jwt contains all user roles (if it doesn't, jwt is either old or tampered with)
foreach(var role in user.Roles)
{
if (!jwtRoleNames.Contains(role.Name))
return false;
-
- jwtRoleNames.Remove(role.Name);
}
// Check if jwt contains only roles of user
- if (jwtRoleNames.Count > 0)
+ if (jwtRoleNames.Count != user.Roles.Count)
return false;
return true;