private void AddProxyOAuthSecurityService(ListedCapabilityStatement statement, string authorizeRouteName, string tokenRouteName) { EnsureArg.IsNotNull(statement, nameof(statement)); EnsureArg.IsNotNullOrWhiteSpace(authorizeRouteName, nameof(authorizeRouteName)); EnsureArg.IsNotNullOrWhiteSpace(tokenRouteName, nameof(tokenRouteName)); ListedRestComponent restComponent = statement.Rest.Server(); SecurityComponent security = restComponent.Security ?? new SecurityComponent(); var codableConceptInfo = new CodableConceptInfo(); security.Service.Add(codableConceptInfo); codableConceptInfo.Coding.Add(_modelInfoProvider.Version == FhirSpecification.Stu3 ? Constants.RestfulSecurityServiceStu3OAuth : Constants.RestfulSecurityServiceOAuth); Uri tokenEndpoint = _urlResolver.ResolveRouteNameUrl(tokenRouteName, null); Uri authorizationEndpoint = _urlResolver.ResolveRouteNameUrl(authorizeRouteName, null); var smartExtension = new { url = Constants.SmartOAuthUriExtension, extension = new[] { new { url = Constants.SmartOAuthUriExtensionToken, valueUri = tokenEndpoint, }, new { url = Constants.SmartOAuthUriExtensionAuthorize, valueUri = authorizationEndpoint, }, }, }; security.Extension.Add(JObject.FromObject(smartExtension)); restComponent.Security = security; }
private void AddOAuthSecurityService(ListedCapabilityStatement statement) { ListedRestComponent restComponent = statement.Rest.Server(); SecurityComponent security = restComponent.Security ?? new SecurityComponent(); var codableConceptInfo = new CodableConceptInfo(); security.Service.Add(codableConceptInfo); codableConceptInfo.Coding.Add(_modelInfoProvider.Version == FhirSpecification.Stu3 ? Constants.RestfulSecurityServiceStu3OAuth : Constants.RestfulSecurityServiceOAuth); var openIdConfigurationUrl = $"{_securityConfiguration.Authentication.Authority}/.well-known/openid-configuration"; HttpResponseMessage openIdConfigurationResponse; using (HttpClient httpClient = _httpClientFactory.CreateClient()) { try { openIdConfigurationResponse = httpClient.GetAsync(new Uri(openIdConfigurationUrl)).GetAwaiter().GetResult(); } catch (Exception ex) { _logger.LogWarning(ex, "There was an exception while attempting to read the OpenId Configuration from \"{openIdConfigurationUrl}\".", openIdConfigurationUrl); throw new OpenIdConfigurationException(); } } if (openIdConfigurationResponse.IsSuccessStatusCode) { JObject openIdConfiguration = JObject.Parse(openIdConfigurationResponse.Content.ReadAsStringAsync().GetAwaiter().GetResult()); string tokenEndpoint, authorizationEndpoint; try { tokenEndpoint = openIdConfiguration["token_endpoint"].Value <string>(); authorizationEndpoint = openIdConfiguration["authorization_endpoint"].Value <string>(); } catch (Exception ex) { _logger.LogWarning(ex, "There was an exception while attempting to read the endpoints from \"{openIdConfigurationUrl}\".", openIdConfigurationUrl); throw new OpenIdConfigurationException(); } var smartExtension = new { url = Constants.SmartOAuthUriExtension, extension = new[] { new { url = Constants.SmartOAuthUriExtensionToken, valueUri = tokenEndpoint, }, new { url = Constants.SmartOAuthUriExtensionAuthorize, valueUri = authorizationEndpoint, }, }, }; security.Extension.Add(JObject.FromObject(smartExtension)); } else { _logger.LogWarning("The OpenId Configuration request from \"{openIdConfigurationUrl}\" returned an {statusCode} status code.", openIdConfigurationUrl, openIdConfigurationResponse.StatusCode); throw new OpenIdConfigurationException(); } restComponent.Security = security; }