Skip to content

Commit 56e583a

Browse files
committed
Allow multiple roles
Signed-off-by: Victor Chang <vicchang@nvidia.com>
1 parent 32e203b commit 56e583a

File tree

8 files changed

+47
-34
lines changed

8 files changed

+47
-34
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: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,32 @@ public static List<string> GetValidEndpoints(this HttpContext httpcontext, ILogg
3737

3838
foreach (var claim in adminClaims!)
3939
{
40-
if (httpcontext.User.HasClaim(claim.Claim, claim.Role))
40+
foreach (var role in claim.Roles)
4141
{
42-
logger.UserClaimFound(claim.Claim, claim.Role);
43-
return new List<string> { "all" };
42+
logger.CheckingUserClaim(claim.Claim, role);
43+
if (httpcontext.User.HasClaim(claim.Claim, role))
44+
{
45+
logger.UserClaimFound(claim.Claim, role);
46+
return new List<string> { "*" };
47+
}
4448
}
4549
}
4650

51+
var endpoints = new List<string>();
4752
foreach (var claim in userClaims!)
4853
{
49-
if (httpcontext.User.HasClaim(claim.Claim, claim.Role))
54+
foreach (var role in claim.Roles)
5055
{
51-
logger.UserClaimFound(claim.Claim, claim.Role);
52-
return claim.Endpoints!;
56+
logger.CheckingUserClaim(claim.Claim, role);
57+
if (httpcontext.User.HasClaim(claim.Claim, role))
58+
{
59+
logger.UserClaimFound(claim.Claim, role);
60+
endpoints.AddRange(claim.Endpoints!);
61+
}
5362
}
5463
}
5564

56-
return new List<string>();
65+
return endpoints.Distinct().ToList();
5766
}
5867
}
5968
}

src/Authentication/Logging.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,8 @@ public static partial class Log
3131

3232
[LoggerMessage(EventId = 500003, Level = LogLevel.Debug, 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 = "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)