My server works as a proxy for a user's search request. Before requesting data on Azure we need to ensure everything is secure. For this we add certain filters into the query filter. Let's say my server receives this query:
search=&$top=10&$filter=customer/customerId gt 1 and customer/customerId lt 5
I want to break it apart, investigate it's filter piece by piece and inject a security filter into it.
First thing I do is I get the filter:
var parsed = HttpUtility.ParseQueryString(query);
var filter = parsed["$filter"];
Next, I want to process it in order to verify and make changes.
After reading this post I am trying to utilize ODataUriParser
like so:
// 1. Create a dummy model
public static IEdmModel GetEdmModel()
{
var model = new EdmModel();
EdmEntityType customer = new EdmEntityType("Namespace", "Customer");
customer.AddKeys(customer.AddStructuralProperty("CustomerId", EdmPrimitiveTypeKind.Int32));
model.AddElement(customer);
return model;
}
// 2. Utilize it
static void Foo()
{
var query = "search=&$top=5001&$filter=Customer/CustomerId eq 1";
var parsed = HttpUtility.ParseQueryString(query);
var filter = parsed["$filter"];
var result = new ODataUriParser(HardCodedTestModel.TestModel, new Uri(filter, UriKind.Relative));
var parsedFilter = result.ParseFilter();
}
This throws an exception to me, saying:
Unhandled exception. Microsoft.OData.UriParser.ODataUnrecognizedPathException: Resource not found for the segment 'Customer
- What am I doing wrong?
- Is there more easier way to achieve what I want?