Пример #1
0
        private IEnumerable <SCIMBulkOperationRequest> ExtractRequest(JObject jObj)
        {
            var requestedSchemas = jObj.GetSchemas();

            if (!requestedSchemas.Any())
            {
                throw new SCIMBadSyntaxException(string.Format(Global.AttributeMissing, SCIMConstants.StandardSCIMRepresentationAttributes.Schemas));
            }

            if (!new List <string> {
                SCIMConstants.StandardSchemas.BulkRequestSchemas.Id
            }.SequenceEqual(requestedSchemas))
            {
                throw new SCIMBadSyntaxException(Global.SchemasNotRecognized);
            }

            var operations = jObj.SelectToken("Operations") as JArray;

            if (operations == null)
            {
                throw new SCIMBadSyntaxException(string.Format(Global.AttributeMissing, SCIMConstants.StandardSCIMRepresentationAttributes.Operations));
            }

            var result = new List <SCIMBulkOperationRequest>();

            foreach (JObject operation in operations)
            {
                var record = new SCIMBulkOperationRequest();
                if (operation.ContainsKey(SCIMConstants.StandardSCIMRepresentationAttributes.Method))
                {
                    record.HttpMethod = operation[SCIMConstants.StandardSCIMRepresentationAttributes.Method].ToString();
                }

                if (operation.ContainsKey(SCIMConstants.StandardSCIMRepresentationAttributes.Path))
                {
                    record.Path = operation[SCIMConstants.StandardSCIMRepresentationAttributes.Path].ToString();
                }

                if (operation.ContainsKey(SCIMConstants.StandardSCIMRepresentationAttributes.BulkId))
                {
                    record.BulkIdentifier = operation[SCIMConstants.StandardSCIMRepresentationAttributes.BulkId].ToString();
                }

                if (operation.ContainsKey(SCIMConstants.StandardSCIMRepresentationAttributes.Data))
                {
                    record.Data = JToken.Parse(operation[SCIMConstants.StandardSCIMRepresentationAttributes.Data].ToString());
                }

                result.Add(record);
            }

            return(result);
        }
Пример #2
0
        private IEnumerable <SCIMBulkOperationRequest> ExtractRequest(JObject jObj)
        {
            var requestedSchemas = jObj.GetSchemas();

            if (!requestedSchemas.Any())
            {
                throw new SCIMBadRequestException("invalidRequest", $"{SCIMConstants.StandardSCIMRepresentationAttributes.Schemas} attribute is missing");
            }

            if (!new List <string> {
                SCIMConstants.StandardSchemas.BulkRequestSchemas.Id
            }.SequenceEqual(requestedSchemas))
            {
                throw new SCIMBadRequestException("invalidRequest", $"some schemas are not recognized by the endpoint");
            }
            var operations = jObj.SelectToken("Operations") as JArray;

            if (operations == null)
            {
                throw new SCIMBadRequestException("invalidRequest", "Operations parameter must be passed");
            }

            var result = new List <SCIMBulkOperationRequest>();

            foreach (JObject operation in operations)
            {
                var record = new SCIMBulkOperationRequest();
                if (operation.ContainsKey(SCIMConstants.StandardSCIMRepresentationAttributes.Method))
                {
                    record.HttpMethod = operation[SCIMConstants.StandardSCIMRepresentationAttributes.Method].ToString();
                }

                if (operation.ContainsKey(SCIMConstants.StandardSCIMRepresentationAttributes.Path))
                {
                    record.Path = operation[SCIMConstants.StandardSCIMRepresentationAttributes.Path].ToString();
                }

                if (operation.ContainsKey(SCIMConstants.StandardSCIMRepresentationAttributes.BulkId))
                {
                    record.BulkIdentifier = operation[SCIMConstants.StandardSCIMRepresentationAttributes.BulkId].ToString();
                }

                if (operation.ContainsKey(SCIMConstants.StandardSCIMRepresentationAttributes.Data))
                {
                    record.Data = JToken.Parse(operation[SCIMConstants.StandardSCIMRepresentationAttributes.Data].ToString());
                }

                result.Add(record);
            }

            return(result);
        }
Пример #3
0
        private async Task <JObject> ExecuteBulkOperation(SCIMBulkOperationRequest scimBulkOperationRequest)
        {
            var router   = RouteData.Routers.OfType <IRouteCollection>().First();
            var features = new FeatureCollection();

            features.Set <IHttpRequestFeature>(new HttpRequestFeature());
            features.Set <IRoutingFeature>(new RoutingFeature
            {
                RouteData = RouteData
            });
            features.Set <IHttpResponseFeature>(new HttpResponseFeature());
            features.Set <IResponseCookiesFeature>(new ResponseCookiesFeature(features));
            var newHttpContext = new DefaultHttpContext(features);

            newHttpContext.Request.Path   = scimBulkOperationRequest.Path;
            newHttpContext.Request.Method = scimBulkOperationRequest.HttpMethod;
            if (scimBulkOperationRequest.Data != null && (scimBulkOperationRequest.HttpMethod.Equals("POST", StringComparison.InvariantCultureIgnoreCase) ||
                                                          scimBulkOperationRequest.HttpMethod.Equals("PUT", StringComparison.InvariantCultureIgnoreCase) ||
                                                          scimBulkOperationRequest.HttpMethod.Equals("PATCH", StringComparison.InvariantCultureIgnoreCase)))
            {
                newHttpContext.Request.ContentType = SCIMConstants.STANDARD_SCIM_CONTENT_TYPE;
                newHttpContext.Request.Body        = new MemoryStream(Encoding.UTF8.GetBytes(scimBulkOperationRequest.Data.ToString()));
            }

            newHttpContext.RequestServices = HttpContext.RequestServices;
            newHttpContext.Response.Body   = new MemoryStream();
            var routeContext = new RouteContext(newHttpContext)
            {
                RouteData = RouteData
            };
            await router.RouteAsync(routeContext);

            var ctx = routeContext.HttpContext;
            await routeContext.Handler.Invoke(newHttpContext);

            var result = new JObject
            {
                { SCIMConstants.StandardSCIMRepresentationAttributes.Method, scimBulkOperationRequest.HttpMethod },
                { SCIMConstants.StandardSCIMRepresentationAttributes.BulkId, scimBulkOperationRequest.BulkIdentifier }
            };
            var statusCode    = newHttpContext.Response.StatusCode;
            var statusContent = new JObject();

            statusContent.Add("code", statusCode);
            if (statusCode >= 400)
            {
                newHttpContext.Response.Body.Position = 0;
                using (var reader = new StreamReader(newHttpContext.Response.Body))
                {
                    var responseBody = await reader.ReadToEndAsync();

                    JObject json          = (JObject)JsonConvert.DeserializeObject(responseBody);
                    var     response      = new JObject();
                    var     scimTypeToken = json.SelectToken("response.scimType");
                    var     detailToken   = json.SelectToken("response.detail");
                    if (scimTypeToken != null)
                    {
                        response.Add("scimType", scimTypeToken.ToString());
                    }

                    if (detailToken != null)
                    {
                        response.Add("detail", detailToken.ToString());
                    }

                    statusContent.Add("response", response);
                }
            }

            result.Add("status", statusContent);
            if (newHttpContext.Response.Headers.ContainsKey("ETag"))
            {
                result.Add("version", newHttpContext.Response.Headers["ETag"].First());
            }

            if (newHttpContext.Response.Headers.ContainsKey("Location"))
            {
                result.Add("location", newHttpContext.Response.Headers["Location"].First());
            }

            return(result);
        }