Skip to content

Commit 7bbdcef

Browse files
committed
Log user claims
Signed-off-by: Victor Chang <[email protected]>
1 parent 32e203b commit 7bbdcef

File tree

8 files changed

+54
-37
lines changed

8 files changed

+54
-37
lines changed

src/Authentication/Configurations/AuthenticationOptions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ namespace Monai.Deploy.Security.Authentication.Configurations
2424
{
2525
public class AuthenticationOptions
2626
{
27-
[ConfigurationKeyName("BypassAuthentication")]
27+
[ConfigurationKeyName("bypassAuthentication")]
2828
public bool? BypassAuthentication { get; set; }
2929

30-
[ConfigurationKeyName("OpenId")]
30+
[ConfigurationKeyName("openId")]
3131
public OpenIdOptions? OpenId { get; set; }
3232

3333
public bool BypassAuth(ILogger logger)

src/Authentication/Configurations/ClaimMappings.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ namespace Monai.Deploy.Security.Authentication.Configurations
2020
{
2121
public class ClaimMappings
2222
{
23-
[ConfigurationKeyName("UserClaims")]
23+
[ConfigurationKeyName("userClaims")]
2424
public List<ClaimMapping>? UserClaims { get; set; }
2525

26-
[ConfigurationKeyName("AdminClaims")]
26+
[ConfigurationKeyName("adminClaims")]
2727
public List<ClaimMapping>? AdminClaims { get; set; }
2828
}
2929

@@ -32,8 +32,8 @@ public class ClaimMapping
3232
[ConfigurationKeyName("claim")]
3333
public string Claim { get; set; } = string.Empty;
3434

35-
[ConfigurationKeyName("role")]
36-
public string Role { get; set; } = string.Empty;
35+
[ConfigurationKeyName("roles")]
36+
public List<string> Roles { get; set; } = new List<string>();
3737

3838
[ConfigurationKeyName("endpoints")]
3939
public List<string>? Endpoints { get; set; } = default;

src/Authentication/Configurations/OpenIdOptions.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,19 @@ namespace Monai.Deploy.Security.Authentication.Configurations
2020
{
2121
public class OpenIdOptions
2222
{
23-
[ConfigurationKeyName("ServerRealm")]
23+
[ConfigurationKeyName("realm")]
2424
public string? ServerRealm { get; set; }
2525

26-
[ConfigurationKeyName("ServerRealmKey")]
26+
[ConfigurationKeyName("realmKey")]
2727
public string? ServerRealmKey { get; set; }
2828

29-
[ConfigurationKeyName("ClientId")]
29+
[ConfigurationKeyName("clientId")]
3030
public string? ClientId { get; set; }
3131

32-
[ConfigurationKeyName("ClaimMappings")]
32+
[ConfigurationKeyName("claimMappings")]
3333
public ClaimMappings? Claims { get; set; }
3434

35-
[ConfigurationKeyName("Audiences")]
35+
[ConfigurationKeyName("audiences")]
3636
public IList<string>? Audiences { get; set; }
3737
}
3838
}

src/Authentication/Extensions/HttpContextExtension.cs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,33 +27,46 @@ public static class HttpContextExtension
2727
/// <summary>
2828
/// Gets endpoints specified in config for roles in claims.
2929
/// </summary>
30-
/// <param name="httpcontext"></param>
30+
/// <param name="httpContext"></param>
3131
/// <param name="requiredClaims"></param>
3232
/// <returns></returns>
33-
public static List<string> GetValidEndpoints(this HttpContext httpcontext, ILogger<EndpointAuthorizationMiddleware> logger, List<Configurations.ClaimMapping> adminClaims, List<Configurations.ClaimMapping> userClaims)
33+
public static List<string> GetValidEndpoints(this HttpContext httpContext, ILogger<EndpointAuthorizationMiddleware> logger, List<Configurations.ClaimMapping> adminClaims, List<Configurations.ClaimMapping> userClaims)
3434
{
3535
Guard.Against.Null(adminClaims);
3636
Guard.Against.Null(userClaims);
3737

38+
foreach (var claim in httpContext.User.Claims)
39+
{
40+
logger.UserClaimFound(claim.Type, claim.Value);
41+
42+
}
43+
3844
foreach (var claim in adminClaims!)
3945
{
40-
if (httpcontext.User.HasClaim(claim.Claim, claim.Role))
46+
foreach (var role in claim.Roles)
4147
{
42-
logger.UserClaimFound(claim.Claim, claim.Role);
43-
return new List<string> { "all" };
48+
logger.CheckingUserClaim(claim.Claim, role);
49+
if (httpContext.User.HasClaim(claim.Claim, role))
50+
{
51+
return new List<string> { "*" };
52+
}
4453
}
4554
}
4655

56+
var endpoints = new List<string>();
4757
foreach (var claim in userClaims!)
4858
{
49-
if (httpcontext.User.HasClaim(claim.Claim, claim.Role))
59+
foreach (var role in claim.Roles)
5060
{
51-
logger.UserClaimFound(claim.Claim, claim.Role);
52-
return claim.Endpoints!;
61+
logger.CheckingUserClaim(claim.Claim, role);
62+
if (httpContext.User.HasClaim(claim.Claim, role))
63+
{
64+
endpoints.AddRange(claim.Endpoints!);
65+
}
5366
}
5467
}
5568

56-
return new List<string>();
69+
return endpoints.Distinct().ToList();
5770
}
5871
}
5972
}

src/Authentication/Logging.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ public static partial class Log
2929
[LoggerMessage(EventId = 500002, Level = LogLevel.Debug, Message = "User '{user}' access denied due to limited permissions: '{permissions}'.")]
3030
public static partial void UserAccessDenied(this ILogger logger, string? user, string? permissions);
3131

32-
[LoggerMessage(EventId = 500003, Level = LogLevel.Debug, Message = "User claim {claim}={value}.")]
32+
[LoggerMessage(EventId = 500003, Level = LogLevel.Trace, Message = "User claim {claim}={value}.")]
3333
public static partial void UserClaimFound(this ILogger logger, string? claim, string? value);
34+
35+
[LoggerMessage(EventId = 500004, Level = LogLevel.Trace, Message = "Checking user claim {claim}={value}.")]
36+
public static partial void CheckingUserClaim(this ILogger logger, string? claim, string? value);
3437
}
3538
}

src/Authentication/Middleware/EndpointAuthorizationMiddleware.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public async Task InvokeAsync(HttpContext httpContext)
5757
{
5858
_logger.UserAccessingController(httpContext.User.Identity.Name, controller);
5959
var validEndpoints = httpContext.GetValidEndpoints(_logger, _options.Value.OpenId!.Claims!.AdminClaims!, _options.Value.OpenId!.Claims!.UserClaims!);
60-
var result = validEndpoints.Any(e => e.Equals(controller, StringComparison.InvariantCultureIgnoreCase)) || validEndpoints.Contains("all");
60+
var result = validEndpoints.Any(e => e.Equals(controller, StringComparison.InvariantCultureIgnoreCase)) || validEndpoints.Contains("*");
6161

6262
if (result is false)
6363
{

src/Authentication/Tests/test.auth.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
{
22
"MonaiDeployAuthentication": {
3-
"BypassAuthentication": false,
4-
"OpenId": {
5-
"ServerRealm": "TEST-REALM",
6-
"ServerRealmKey": "l9ZRlbMQBt9k1klUUrlWFuke8WbqnEde",
7-
"Audiences": [ "monai-app" ],
8-
"ClientId": "monai-app-test",
9-
"ClaimMappings": {
10-
"UserClaims": [
3+
"bypassAuthentication": false,
4+
"openId": {
5+
"realm": "TEST-REALM",
6+
"realmKey": "l9ZRlbMQBt9k1klUUrlWFuke8WbqnEde",
7+
"audiences": [ "monai-app" ],
8+
"clientId": "monai-app-test",
9+
"claimMappings": {
10+
"userClaims": [
1111
{
1212
"claim": "user_roles",
13-
"role": "role-with-test",
13+
"roles": [ "role-with-test" ],
1414
"endpoints": [ "test" ]
1515
},
1616
{
1717
"claim": "user_roles",
18-
"roles": "role-without-test",
18+
"roles": [ "role-without-test" ],
1919
"endpoints": [ "no-test" ]
2020
}
2121
],
22-
"AdminClaims": [
22+
"adminClaims": [
2323
{
2424
"claim": "user_roles",
25-
"role": "monai-role-admin"
25+
"roles": [ "monai-role-admin" ]
2626
}
2727
]
2828
}

src/Authentication/example.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,19 @@
1010
"UserClaims": [
1111
{
1212
"claim": "user_roles",
13-
"role": "monai-deploy-user",
13+
"roles": [ "monai-deploy-user" ],
1414
"endpoints": [ "test" ]
1515
},
1616
{
17-
"user_roles": "pacs-admins",
17+
"user_roles": "user_roles",
18+
"roles": [ "pacs-admins" ],
1819
"endpoints": [ "config" ]
1920
}
2021
],
2122
"AdminClaims": [
2223
{
2324
"claim": "user_roles",
24-
"role": "monai-role-admin"
25+
"role": [ "monai-role-admin" ]
2526
}
2627
]
2728
}

0 commit comments

Comments
 (0)