Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 36 additions & 4 deletions src/Scim/SimpleIdServer.Scim.Client/SCIMClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,15 @@ namespace SimpleIdServer.Scim.Client
{
public class SCIMClient : IDisposable
{
private const string DefaultAuthenticationScheme = "Bearer";

private readonly HttpClientHandler _handler = null;
private readonly string _baseUrl;
private HttpClient _httpClient;
private SearchResult<ResourceTypeResult> _resourceTypes;

public string AuthenticationScheme { get; set; } = DefaultAuthenticationScheme;

public SCIMClient(string baseUrl)
{
_baseUrl = baseUrl;
Expand Down Expand Up @@ -76,7 +80,26 @@ public async Task<SearchResult<ResourceTypeResult>> GetResourceTypes(Cancellatio
Method = HttpMethod.Get,
RequestUri = new Uri($"{GetPath(userEdp)}?{queryString}")
};
if(!string.IsNullOrWhiteSpace(accessToken)) request.Headers.Add("Authorization", $"Bearer {accessToken}");
if (!string.IsNullOrWhiteSpace(accessToken)) SetAuthorizationHeader(request, accessToken);
var httpClient = GetHttpClient();
var httpResult = await httpClient.SendAsync(request, cancellationToken);
httpResult.EnsureSuccessStatusCode();
var json = await httpResult.Content.ReadAsStringAsync(cancellationToken);
var jsonObj = JsonObject.Parse(json).AsObject();
return (RepresentationSerializer.DeserializeSearchRepresentations(jsonObj), json);
}

public async Task<(SearchResult<RepresentationResult>, string)> SearchGroups(SearchRequest searchRequest, string accessToken, CancellationToken cancellationToken)
{
if (_resourceTypes == null) await GetResourceTypes(cancellationToken);
var groupEdp = _resourceTypes.Resources.Single(r => r.Name == "Group").Endpoint;
var queryString = SerializeQueryString(searchRequest);
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri($"{GetPath(groupEdp)}?{queryString}")
};
if (!string.IsNullOrWhiteSpace(accessToken)) SetAuthorizationHeader(request, accessToken);
var httpClient = GetHttpClient();
var httpResult = await httpClient.SendAsync(request, cancellationToken);
httpResult.EnsureSuccessStatusCode();
Expand All @@ -94,7 +117,7 @@ public async Task<RepresentationResult> GetGroup(string id, string accessToken,
Method = HttpMethod.Get,
RequestUri = new Uri($"{GetPath(groupEdp)}/{id}")
};
if (!string.IsNullOrWhiteSpace(accessToken)) request.Headers.Add("Authorization", $"Bearer {accessToken}");
if (!string.IsNullOrWhiteSpace(accessToken)) SetAuthorizationHeader(request, accessToken);
var httpClient = GetHttpClient();
var httpResult = await httpClient.SendAsync(request, cancellationToken);
httpResult.EnsureSuccessStatusCode();
Expand All @@ -112,7 +135,7 @@ public async Task<JsonObject> GetUser(string id, string accessToken, Cancellatio
Method = HttpMethod.Get,
RequestUri = new Uri($"{GetPath(groupEdp)}/{id}")
};
if (!string.IsNullOrWhiteSpace(accessToken)) request.Headers.Add("Authorization", $"Bearer {accessToken}");
if (!string.IsNullOrWhiteSpace(accessToken)) SetAuthorizationHeader(request, accessToken);
var httpClient = GetHttpClient();
var httpResult = await httpClient.SendAsync(request, cancellationToken);
httpResult.EnsureSuccessStatusCode();
Expand All @@ -131,14 +154,23 @@ public async Task<SCIMErrorRepresentation> AddUser(JsonObject jsonObject, string
RequestUri = new Uri(GetPath(userEdp)),
Content = new StringContent(jsonObject.ToJsonString(), Encoding.UTF8, "application/json")
};
if (!string.IsNullOrWhiteSpace(accessToken)) request.Headers.Add("Authorization", $"Bearer {accessToken}");
if (!string.IsNullOrWhiteSpace(accessToken)) SetAuthorizationHeader(request, accessToken);
var httpClient = GetHttpClient();
var httpResult = await httpClient.SendAsync(request, cancellationToken);
if (httpResult.IsSuccessStatusCode) return null;
var content = await httpResult.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<SCIMErrorRepresentation>(content);
}

private void SetAuthorizationHeader(HttpRequestMessage request, string accessToken)
{
var headerValue = string.IsNullOrEmpty(AuthenticationScheme)
? accessToken
: string.Join(" ", AuthenticationScheme, accessToken);

request.Headers.Add("Authorization", headerValue);
}

private HttpClient GetHttpClient()
{
if (_httpClient != null) return _httpClient;
Expand Down
2 changes: 2 additions & 0 deletions src/Scim/SimpleIdServer.Scim.Client/SearchRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,7 @@ public class SearchRequest
public int Count { get; set; } = 100;
[JsonPropertyName("startIndex")]
public int StartIndex { get; set; }
[JsonPropertyName("filter")]
public string Filter { get; set; }
}
}