Skip to content

Commit 7b893bd

Browse files
Merge pull request #900 from canea-asb/scim_client_group_search
SCIM client group search
2 parents b9f14a9 + 4207874 commit 7b893bd

2 files changed

Lines changed: 38 additions & 4 deletions

File tree

src/Scim/SimpleIdServer.Scim.Client/SCIMClient.cs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

src/Scim/SimpleIdServer.Scim.Client/SearchRequest.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,7 @@ public class SearchRequest
1111
public int Count { get; set; } = 100;
1212
[JsonPropertyName("startIndex")]
1313
public int StartIndex { get; set; }
14+
[JsonPropertyName("filter")]
15+
public string Filter { get; set; }
1416
}
1517
}

0 commit comments

Comments
 (0)