3
3
4
4
5
5
using Bornlogic . IdentityServer . Extensions ;
6
+ using Bornlogic . IdentityServer . Models ;
7
+ using Bornlogic . IdentityServer . Services ;
6
8
using Bornlogic . IdentityServer . Storage . Models ;
7
9
using Bornlogic . IdentityServer . Storage . Stores ;
8
10
using Bornlogic . IdentityServer . Validation . Models ;
9
11
using Microsoft . Extensions . Logging ;
12
+ using Microsoft . Extensions . Options ;
10
13
11
14
namespace Bornlogic . IdentityServer . Validation . Default
12
15
{
@@ -16,6 +19,8 @@ namespace Bornlogic.IdentityServer.Validation.Default
16
19
public class DefaultResourceValidator : IResourceValidator
17
20
{
18
21
private readonly ILogger _logger ;
22
+ private readonly IClientUserRoleService _clientUserRoleService ;
23
+ private readonly IOptions < ClientRoleOptions > _clientRoleOptions ;
19
24
private readonly IScopeParser _scopeParser ;
20
25
private readonly IResourceStore _store ;
21
26
@@ -25,9 +30,11 @@ public class DefaultResourceValidator : IResourceValidator
25
30
/// <param name="store">The store.</param>
26
31
/// <param name="scopeParser"></param>
27
32
/// <param name="logger">The logger.</param>
28
- public DefaultResourceValidator ( IResourceStore store , IScopeParser scopeParser , ILogger < DefaultResourceValidator > logger )
33
+ public DefaultResourceValidator ( IResourceStore store , IScopeParser scopeParser , ILogger < DefaultResourceValidator > logger , IClientUserRoleService clientUserRoleService , IOptions < ClientRoleOptions > clientRoleOptions )
29
34
{
30
35
_logger = logger ;
36
+ _clientUserRoleService = clientUserRoleService ;
37
+ _clientRoleOptions = clientRoleOptions ;
31
38
_scopeParser = scopeParser ;
32
39
_store = store ;
33
40
}
@@ -65,20 +72,30 @@ public virtual async Task<ResourceValidationResult> ValidateRequestedResourcesAs
65
72
return result ;
66
73
}
67
74
68
- var scopeNames = parsedScopesResult . ParsedScopes . Select ( x => x . ParsedName ) . Distinct ( ) . ToArray ( ) ;
69
- var resourcesFromStore = await _store . FindEnabledResourcesByScopeAsync ( scopeNames ) ;
75
+ var subjectIdOrDefault = request . Subject ? . GetSubjectIdOrDefault ( ) ;
70
76
71
- foreach ( var scope in parsedScopesResult . ParsedScopes )
77
+ if ( ! string . IsNullOrEmpty ( subjectIdOrDefault ) )
72
78
{
73
- await ValidateScopeAsync ( request . Client , resourcesFromStore , scope , result , request . RequiredRequestScopes . Any ( a => a == scope . ParsedName ) ) ;
74
- }
79
+ var hasRoleToBypassScopeValidation = await _clientUserRoleService . UserHasLoginByPassRoleInClient ( subjectIdOrDefault , request . Client , _clientRoleOptions ? . Value ? . ValidUserRolesToBypassClientScopeValidation ) ;
75
80
76
- var requiredRequestScopeNames = parsedRequiredRequestScopesResult . ParsedScopes . Select ( x => x . ParsedName ) . Distinct ( ) . ToArray ( ) ;
77
- var requiredRequestResourcesFromStore = await _store . FindEnabledResourcesByScopeAsync ( requiredRequestScopeNames ) ;
81
+ if ( ! hasRoleToBypassScopeValidation )
82
+ {
83
+ var scopeNames = parsedScopesResult . ParsedScopes . Select ( x => x . ParsedName ) . Distinct ( ) . ToArray ( ) ;
84
+ var resourcesFromStore = await _store . FindEnabledResourcesByScopeAsync ( scopeNames ) ;
78
85
79
- foreach ( var scope in parsedRequiredRequestScopesResult . ParsedScopes )
80
- {
81
- await ValidateRequestRequiredScopeAsync ( request . Client , requiredRequestResourcesFromStore , scope , result ) ;
86
+ foreach ( var scope in parsedScopesResult . ParsedScopes )
87
+ {
88
+ await ValidateScopeAsync ( request . Client , resourcesFromStore , scope , result , request . RequiredRequestScopes . Any ( a => a == scope . ParsedName ) ) ;
89
+ }
90
+
91
+ var requiredRequestScopeNames = parsedRequiredRequestScopesResult . ParsedScopes . Select ( x => x . ParsedName ) . Distinct ( ) . ToArray ( ) ;
92
+ var requiredRequestResourcesFromStore = await _store . FindEnabledResourcesByScopeAsync ( requiredRequestScopeNames ) ;
93
+
94
+ foreach ( var scope in parsedRequiredRequestScopesResult . ParsedScopes )
95
+ {
96
+ await ValidateRequestRequiredScopeAsync ( request . Client , requiredRequestResourcesFromStore , scope , result ) ;
97
+ }
98
+ }
82
99
}
83
100
84
101
if ( result . InvalidScopes . Count > 0 )
0 commit comments