@@ -16,11 +16,15 @@ namespace SimpleIdServer.Scim.Client
1616{
1717 public class SCIMClient : IDisposable
1818 {
19+ private const string DefaultAuthenticationScheme = "Bearer" ;
20+
1921 private readonly HttpClientHandler _handler = null ;
2022 private readonly string _baseUrl ;
2123 private HttpClient _httpClient ;
2224 private SearchResult < ResourceTypeResult > _resourceTypes ;
2325
26+ public string AuthenticationScheme { get ; set ; } = DefaultAuthenticationScheme ;
27+
2428 public SCIMClient ( string baseUrl )
2529 {
2630 _baseUrl = baseUrl ;
@@ -76,7 +80,26 @@ public async Task<SearchResult<ResourceTypeResult>> GetResourceTypes(Cancellatio
7680 Method = HttpMethod . Get ,
7781 RequestUri = new Uri ( $ "{ GetPath ( userEdp ) } ?{ queryString } ")
7882 } ;
79- if ( ! string . IsNullOrWhiteSpace ( accessToken ) ) request . Headers . Add ( "Authorization" , $ "Bearer { accessToken } ") ;
83+ if ( ! string . IsNullOrWhiteSpace ( accessToken ) ) SetAuthorizationHeader ( request , accessToken ) ;
84+ var httpClient = GetHttpClient ( ) ;
85+ var httpResult = await httpClient . SendAsync ( request , cancellationToken ) ;
86+ httpResult . EnsureSuccessStatusCode ( ) ;
87+ var json = await httpResult . Content . ReadAsStringAsync ( cancellationToken ) ;
88+ var jsonObj = JsonObject . Parse ( json ) . AsObject ( ) ;
89+ return ( RepresentationSerializer . DeserializeSearchRepresentations ( jsonObj ) , json ) ;
90+ }
91+
92+ public async Task < ( SearchResult < RepresentationResult > , string ) > SearchGroups ( SearchRequest searchRequest , string accessToken , CancellationToken cancellationToken )
93+ {
94+ if ( _resourceTypes == null ) await GetResourceTypes ( cancellationToken ) ;
95+ var groupEdp = _resourceTypes . Resources . Single ( r => r . Name == "Group" ) . Endpoint ;
96+ var queryString = SerializeQueryString ( searchRequest ) ;
97+ var request = new HttpRequestMessage
98+ {
99+ Method = HttpMethod . Get ,
100+ RequestUri = new Uri ( $ "{ GetPath ( groupEdp ) } ?{ queryString } ")
101+ } ;
102+ if ( ! string . IsNullOrWhiteSpace ( accessToken ) ) SetAuthorizationHeader ( request , accessToken ) ;
80103 var httpClient = GetHttpClient ( ) ;
81104 var httpResult = await httpClient . SendAsync ( request , cancellationToken ) ;
82105 httpResult . EnsureSuccessStatusCode ( ) ;
@@ -94,7 +117,7 @@ public async Task<RepresentationResult> GetGroup(string id, string accessToken,
94117 Method = HttpMethod . Get ,
95118 RequestUri = new Uri ( $ "{ GetPath ( groupEdp ) } /{ id } ")
96119 } ;
97- if ( ! string . IsNullOrWhiteSpace ( accessToken ) ) request . Headers . Add ( "Authorization" , $ "Bearer { accessToken } " ) ;
120+ if ( ! string . IsNullOrWhiteSpace ( accessToken ) ) SetAuthorizationHeader ( request , accessToken ) ;
98121 var httpClient = GetHttpClient ( ) ;
99122 var httpResult = await httpClient . SendAsync ( request , cancellationToken ) ;
100123 httpResult . EnsureSuccessStatusCode ( ) ;
@@ -112,7 +135,7 @@ public async Task<JsonObject> GetUser(string id, string accessToken, Cancellatio
112135 Method = HttpMethod . Get ,
113136 RequestUri = new Uri ( $ "{ GetPath ( groupEdp ) } /{ id } ")
114137 } ;
115- if ( ! string . IsNullOrWhiteSpace ( accessToken ) ) request . Headers . Add ( "Authorization" , $ "Bearer { accessToken } " ) ;
138+ if ( ! string . IsNullOrWhiteSpace ( accessToken ) ) SetAuthorizationHeader ( request , accessToken ) ;
116139 var httpClient = GetHttpClient ( ) ;
117140 var httpResult = await httpClient . SendAsync ( request , cancellationToken ) ;
118141 httpResult . EnsureSuccessStatusCode ( ) ;
@@ -131,14 +154,23 @@ public async Task<SCIMErrorRepresentation> AddUser(JsonObject jsonObject, string
131154 RequestUri = new Uri ( GetPath ( userEdp ) ) ,
132155 Content = new StringContent ( jsonObject . ToJsonString ( ) , Encoding . UTF8 , "application/json" )
133156 } ;
134- if ( ! string . IsNullOrWhiteSpace ( accessToken ) ) request . Headers . Add ( "Authorization" , $ "Bearer { accessToken } " ) ;
157+ if ( ! string . IsNullOrWhiteSpace ( accessToken ) ) SetAuthorizationHeader ( request , accessToken ) ;
135158 var httpClient = GetHttpClient ( ) ;
136159 var httpResult = await httpClient . SendAsync ( request , cancellationToken ) ;
137160 if ( httpResult . IsSuccessStatusCode ) return null ;
138161 var content = await httpResult . Content . ReadAsStringAsync ( ) ;
139162 return JsonSerializer . Deserialize < SCIMErrorRepresentation > ( content ) ;
140163 }
141164
165+ private void SetAuthorizationHeader ( HttpRequestMessage request , string accessToken )
166+ {
167+ var headerValue = string . IsNullOrEmpty ( AuthenticationScheme )
168+ ? accessToken
169+ : string . Join ( " " , AuthenticationScheme , accessToken ) ;
170+
171+ request . Headers . Add ( "Authorization" , headerValue ) ;
172+ }
173+
142174 private HttpClient GetHttpClient ( )
143175 {
144176 if ( _httpClient != null ) return _httpClient ;
0 commit comments